用php暴力破解一個邏輯推理題

這是一個無聊的事情
由于很無聊壳咕,就刷牛客網(wǎng)的智力題,遇到一個邏輯推理題判呕,然后我就和這個題杠上了。

請看題:

前提:

1 有五棟五種顏色的房子
2 每一位房子的主人國籍都不同
3 這五個人每人只喝一種飲料送滞,只抽一種牌子的香煙侠草,只養(yǎng)一種寵物
4 沒有人有相同的寵物,抽相同牌子的香煙犁嗅,喝相同的飲料

提示:

1  英國人住在紅房子里
2  瑞典人養(yǎng)了一條狗
3  丹麥人喝茶
4  綠房子在白房子左邊
5  綠房子主人喝咖啡
6  抽PALL”咛椤MALL煙的人養(yǎng)了一只鳥
7  黃房子主人抽DUNHILL煙
8  住在中間那間房子的人喝牛奶
9  挪威人住第一間房子
10 抽混合煙的人住在養(yǎng)貓人的旁邊
11 養(yǎng)馬人住在抽DUNHILL煙的人旁邊
12 抽BLUE MASTER煙的人喝啤酒
13 德國人抽PRINCE煙
14 挪威人住在藍房子旁邊
15 抽混合煙的人的鄰居喝礦泉水
問題是:誰養(yǎng)魚褂微?功蜓??
浪費了我?guī)讖埣埑杪欤鬯罒o數(shù)腦細胞式撼,推到吐血,也沒推出來求厕,沒辦法只能使出我的殺手锏(世界上最好的語言)

分析:

5棟房子著隆,5個國籍,5種顏色呀癣,5種飲料美浦,5種香煙,5種寵物
暴力破解的第一步就是要把所有的組合列出來吧项栏,也可以大概估算出電腦能不能抗的住
5棟房子就簡單的用1浦辨,2,3沼沈,4荤牍,5來順序排列吧
5種顏色的全組合有多少種呢案腺?初中老師教過,是5的階乘康吵,也就是5 * 4 * 3 * 2 * 1=120
房子是固定的劈榨,剩余有5個變量,也就是一共有120的5次方個組合晦嵌,也就24883200000組合同辣,我那用了八年的破電腦還是能抗住的。
把所有組合列出來之后惭载,就循環(huán)旱函,按照提示進行排除

代碼分析

1,生成120種排列組合

function create()
{
    $arr = [];
    $range = [1, 2, 3, 4, 5];
    for ($i = 12345; $i <= 54321; $i++) {
        $tmp = str_split($i);
        if (count(array_diff($range, $tmp)) == 0) {
            $arr[] = $tmp;
        }
    }
    return $arr;
}

這里用的是最簡單暴力的方法描滔,就不多解釋了
2棒妨,怎么來標記這些組合呢,先來組合一下顏色

$arr = create();
foreach ($arr as $k => $v) {
    $color['紅'] = $v[0];
    $color['白'] = $v[1];
    $color['綠'] = $v[2];
    $color['黃'] = $v[3];
    $color['藍'] = $v[4];
   ...
}

這個是把顏色作為鍵名含长,房子的位置作為鍵值券腔,生成的$color大概就是這個樣子

$color=[
  '紅'=>2, 
  '白'=>1,
  '綠'=>3,
  '黃'=>5,
  '藍'=>4,
];

其他幾個變量也用這種來標記
3,邏輯判斷拘泞,這里是比較關(guān)鍵的一步纷纫,由于用排除法來判斷,所以條件都要取返陪腌,不符合條件的就continue辱魁,換下一種組合

1,英國人住在紅房子里

 if ($county['英國'] != $color['紅']) {
            continue;
 }

如果英國人房子的位置和紅色房子的位置不一樣诗鸭,就排除染簇,跳過去

4,綠房子在白房子左邊

 if ($color['白'] - $color['綠'] != 1) {
            continue;
  }

房子從左往右排的强岸,綠的在白的左邊锻弓,也就是綠的位置比白的位置小1

8,住在中間那間房子的人喝牛奶

 if ($drink['牛奶'] != 3) {
          continue;
}

這就比較簡單了请唱,中間的房子位置編號是3弥咪,所以喝牛奶的房子位置必須是3

10,抽混合煙的人住在養(yǎng)貓人的旁邊

旁邊的話要么是位置大1,要么是位置小1十绑,但肯定位置差的絕對值是1

if (abs($smoke['混合'] - $pet['貓']) != 1) {//10
                    continue;
 }

抽混合煙的人與養(yǎng)貓人的位置相差1
大概就是這幾種判斷了
到這里思路應(yīng)該就清晰了聚至,剩下的只是敲鍵盤了,代碼如下:

/**
 * 生成排列組合
 */
function create()
{
    $arr = [];
    $range = [1, 2, 3, 4, 5];
    for ($i = 12345; $i <= 54321; $i++) {
        $tmp = str_split($i);
        if (count(array_diff($range, $tmp)) == 0) {
            $arr[] = $tmp;
        }
    }
    return $arr;
}

$arr = create();
foreach ($arr as $k1 => $v1) {
    $county['英國'] = $v1[0];
    $county['瑞典'] = $v1[1];
    $county['丹麥'] = $v1[2];
    $county['挪威'] = $v1[3];
    $county['德國'] = $v1[4];
    if ($county['挪威'] != 1) {//9
        continue;
    }
    foreach ($arr as $k2 => $v2) {
        $color['紅'] = $v2[0];
        $color['白'] = $v2[1];
        $color['綠'] = $v2[2];
        $color['黃'] = $v2[3];
        $color['藍'] = $v2[4];
        if ($county['英國'] != $color['紅']) {//1
            continue;
        }
        if ($color['白'] - $color['綠'] != 1) {//4
            continue;
        }
        if (abs($county['挪威'] - $color['藍']) != 1) {//14
            continue;
        }
        foreach ($arr as $k3 => $v3) {
            $pet['魚'] = $v3[0];
            $pet['狗'] = $v3[1];
            $pet['鳥'] = $v3[2];
            $pet['貓'] = $v3[3];
            $pet['馬'] = $v3[4];
            if ($county['瑞典'] != $pet['狗']) {//2
                continue;
            }
            foreach ($arr as $k4 => $v4) {
                $smoke['混合'] = $v4[0];
                $smoke['pall'] = $v4[1];
                $smoke['dunh'] = $v4[2];
                $smoke['blue'] = $v4[3];
                $smoke['prin'] = $v4[4];
                if ($smoke['pall'] != $pet['鳥']) {//6
                    continue;
                }
                if ($color['黃'] != $smoke['dunh']) {//7
                    continue;
                }
                if (abs($smoke['混合'] - $pet['貓']) != 1) {//10
                    continue;
                }
                if (abs($pet['馬'] - $smoke['dunh']) != 1) {//11
                    continue;
                }
                if ($county['德國'] != $smoke['prin']) {//13
                    continue;
                }
                foreach ($arr as $k5 => $v5) {
                    $drink['礦泉水'] = $v5[0];
                    $drink['茶'] = $v5[1];
                    $drink['咖啡'] = $v5[2];
                    $drink['牛奶'] = $v5[3];
                    $drink['啤酒'] = $v5[4];
                    if ($county['丹麥'] != $drink['茶']) {//3
                        continue;
                    }
                    if ($color['綠'] != $drink['咖啡']) {//5
                        continue;
                    }
                    if ($drink['牛奶'] != 3) {//8
                        continue;
                    }
                    if ($smoke['blue'] != $drink['啤酒']) {//12
                        continue;
                    }
                    if (abs($smoke['混合'] - $drink['礦泉水']) != 1) {//15
                        continue;
                    }
                    print_arr(compact('county', 'color', 'pet', 'smoke', 'drink'));
                }
            }
        }
    }
}

/**
 * 打印結(jié)果
 */
function print_arr($arr)
{
    foreach ($arr as $k => $v) {
        $sort = array_flip($v);
        ksort($sort);
        $tmp[] = $sort;
    }
    foreach ($tmp as $k => $v) {
        for ($i = 1; $i <= 5; $i++) {
            echo $tmp[$k][$i], "\t";
        }
        echo "\n\r";
    }
}

答案就不放了本橙,可以自己試一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扳躬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贷币,老刑警劉巖击胜,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異役纹,居然都是意外死亡偶摔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門促脉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辰斋,“玉大人,你說我怎么就攤上這事瘸味」蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵旁仿,是天一觀的道長藕夫。 經(jīng)常有香客問我,道長枯冈,這世上最難降的妖魔是什么毅贮? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮霜幼,結(jié)果婚禮上嫩码,老公的妹妹穿的比我還像新娘誉尖。我一直安慰自己罪既,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布铡恕。 她就那樣靜靜地躺著琢感,像睡著了一般。 火紅的嫁衣襯著肌膚如雪探熔。 梳的紋絲不亂的頭發(fā)上驹针,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音诀艰,去河邊找鬼柬甥。 笑死,一個胖子當(dāng)著我的面吹牛其垄,可吹牛的內(nèi)容都是我干的苛蒲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绿满,長吁一口氣:“原來是場噩夢啊……” “哼臂外!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漏健,失蹤者是張志新(化名)和其女友劉穎嚎货,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔫浆,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡殖属,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓦盛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忱辅。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谭溉,靈堂內(nèi)的尸體忽然破棺而出墙懂,到底是詐尸還是另有隱情,我是刑警寧澤扮念,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布损搬,位于F島的核電站,受9級特大地震影響柜与,放射性物質(zhì)發(fā)生泄漏巧勤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一弄匕、第九天 我趴在偏房一處隱蔽的房頂上張望颅悉。 院中可真熱鬧,春花似錦迁匠、人聲如沸剩瓶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽延曙。三九已至,卻和暖如春亡哄,著一層夾襖步出監(jiān)牢的瞬間枝缔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蚊惯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愿卸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓截型,卻偏偏與公主長得像趴荸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菠劝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 細水長流的生活相對真實赊舶,不浮躁而沉穩(wěn)睁搭,安全感更多來自于內(nèi)心的安穩(wěn)!
    Eva1121閱讀 54評論 0 0
  • 1笼平,要知道自己真正的敵人——自己的大腦 2园骆,與時間做朋友,就應(yīng)了解時間的方方面面 3寓调,《奇特的一生》——柳比歇夫是...
    silvermorning閱讀 179評論 0 0
  • 致螢火 戴望舒 螢火锌唾,螢火, 你來照我夺英。 照我晌涕,照這沾露的草, 照這泥土痛悯,照到你老余黎。 我躺在這里,讓一顆芽 穿過我...
    記得笑ie閱讀 474評論 0 0
  • 創(chuàng)業(yè)模式载萌、對創(chuàng)業(yè)者的個人素質(zhì)要求很高惧财,創(chuàng)業(yè)成功往往形成獨角獸企業(yè)、有時形成新的業(yè)態(tài)扭仁。 創(chuàng)業(yè)者首先要處理好創(chuàng)意垮衷、創(chuàng)新...
    隱世少爺閱讀 367評論 0 0