這是一個無聊的事情
由于很無聊壳咕,就刷牛客網(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";
}
}
答案就不放了本橙,可以自己試一下