用php暴力破解一个逻辑推理题

这是一个无聊的事情
由于很无聊,就刷牛客网的智力题,遇到一个逻辑推理题,然后我就和这个题杠上了。

请看题:

前提:

1 有五栋五种颜色的房子
2 每一位房子的主人国籍都不同
3 这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物
4 没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料

提示:

1  英国人住在红房子里
2  瑞典人养了一条狗
3  丹麦人喝茶
4  绿房子在白房子左边
5  绿房子主人喝咖啡
6  抽PALL MALL烟的人养了一只鸟
7  黄房子主人抽DUNHILL烟
8  住在中间那间房子的人喝牛奶
9  挪威人住第一间房子
10 抽混合烟的人住在养猫人的旁边
11 养马人住在抽DUNHILL烟的人旁边
12 抽BLUE MASTER烟的人喝啤酒
13 德国人抽PRINCE烟
14 挪威人住在蓝房子旁边
15 抽混合烟的人的邻居喝矿泉水
问题是:谁养鱼???
浪费了我几张纸,累死无数脑细胞,推到吐血,也没推出来,没办法只能使出我的杀手锏(世界上最好的语言)

分析:

5栋房子,5个国籍,5种颜色,5种饮料,5种香烟,5种宠物
暴力破解的第一步就是要把所有的组合列出来吧,也可以大概估算出电脑能不能抗的住
5栋房子就简单的用1,2,3,4,5来顺序排列吧
5种颜色的全组合有多少种呢?初中老师教过,是5的阶乘,也就是5 * 4 * 3 * 2 * 1=120
房子是固定的,剩余有5个变量,也就是一共有120的5次方个组合,也就24883200000组合,我那用了八年的破电脑还是能抗住的。
把所有组合列出来之后,就循环,按照提示进行排除

代码分析

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,逻辑判断,这里是比较关键的一步,由于用排除法来判断,所以条件都要取返,不符合条件的就continue,换下一种组合

1,英国人住在红房子里

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

如果英国人房子的位置和红色房子的位置不一样,就排除,跳过去

4,绿房子在白房子左边

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

房子从左往右排的,绿的在白的左边,也就是绿的位置比白的位置小1

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

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

这就比较简单了,中间的房子位置编号是3,所以喝牛奶的房子位置必须是3

10,抽混合烟的人住在养猫人的旁边

旁边的话要么是位置大1,要么是位置小1,但肯定位置差的绝对值是1

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

抽混合烟的人与养猫人的位置相差1
大概就是这几种判断了
到这里思路应该就清晰了,剩下的只是敲键盘了,代码如下:

/**
 * 生成排列组合
 */
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'));
                }
            }
        }
    }
}

/**
 * 打印结果
 */
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";
    }
}

答案就不放了,可以自己试一下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 细水长流的生活相对真实,不浮躁而沉稳,安全感更多来自于内心的安稳!
    Eva1121阅读 49评论 0 0
  • 1,要知道自己真正的敌人——自己的大脑 2,与时间做朋友,就应了解时间的方方面面 3,《奇特的一生》——柳比歇夫是...
    silvermorning阅读 154评论 0 0
  • 致萤火 戴望舒 萤火,萤火, 你来照我。 照我,照这沾露的草, 照这泥土,照到你老。 我躺在这里,让一颗芽 穿过我...
    记得笑ie阅读 456评论 0 0
  • 创业模式、对创业者的个人素质要求很高,创业成功往往形成独角兽企业、有时形成新的业态。 创业者首先要处理好创意、创新...
    隐世少爷阅读 364评论 0 0