日期:2013-06-12  浏览次数:20413 次

 

现有题号称爱因斯坦出的智力题全世界只有2%能够做出。
------------------------------------------------
1、在一条街上,有5座房子,喷了5种颜色。
2、每个房里住着不同国籍的人
3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物
问题是:谁养鱼?
提示:
1、英国人住红色房子
2、瑞典人养狗
3、丹麦人喝茶
4、绿色房子在白色房子左面
5、绿色房子主人喝咖啡
6、抽Pall Mall 香烟的人养鸟
7、黄色房子主人抽Dunhill 香烟
8、住在中间房子的人喝牛奶
9、 挪威人住第一间房
10、抽Blends香烟的人住在养猫的人隔壁
11、养马的人住抽Dunhill 香烟的人隔壁
12、抽Blue Master的人喝啤酒
13、德国人抽Prince香烟
14、挪威人住蓝色房子隔壁
15、抽Blends香烟的人有一个喝水的邻居
---------------------------------------
这里我想讲的是通过暴力算法穷举所有可能让计算机进行求解。
第一次试验使用“纯暴力”解法。问题规模达到(5!=120)5次幂,大于10G。本人花了将近30分钟运行,计算机依然没有算出结果。估计就是算一天也未必能结束。
于是在第二次试验中该进算法,通过使用类似逻辑中“短路”(如:a&&b&&c当a为假时b,c可以不需要计算结果也为假)的生成算法瞬间即可得到结果。
结论:
在这次经历中,我既感到通过写程序解决实际问题带来的快乐也进一步感受了算法的重要性。好的算法带来的效率是十分可观的。
说明:
1根据试验第四句话的左临意思包括相邻,否则解不惟一。

ProTable.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace SolvePuzzle
{

    enum 国籍{英国,瑞典,丹麦,挪威,德国};
    enum 颜色 {红,绿,蓝,黄,白};
    enum 宠物 { 鸟,猫,马,鱼,狗};
    enum 饮料 {水,牛奶,咖啡,茶,啤酒};
    enum 香烟 { blends,blue,prince,dunhill,pall};
    public class ProTable
    {
        private const string rule = @"
1、在一条街上,有5座房子,喷了5种颜色。
2、每个房里住着不同国籍的人
3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物
问题是:谁养鱼?
提示:
1、英国人住红色房子
2、瑞典人养狗
3、丹麦人喝茶
4、绿色房子在白色房子左面
5、绿色房子主人喝咖啡
6、抽Pall Mall 香烟的人养鸟
7、黄色房子主人抽Dunhill 香烟
8、住在中间房子的人喝牛奶
9、 挪威人住第一间房
10、抽Blends香烟的人住在养猫的人隔壁
11、养马的人住抽Dunhill 香烟的人隔壁
12、抽Blue Master的人喝啤酒
13、德国人抽Prince香烟
14、挪威人住蓝色房子隔壁
15、抽Blends香烟的人有一个喝水的邻居
        ";
        public string Rule { get { return rule; } }

        private enum T{国籍=0,颜色,宠物,饮料,香烟};
        private const int N = 5;
        //求排列
        private static int[,] aid = new int[120, N];
        static ProTable()
        {
            int k = 0;
            for (int i0 = 0; i0 < N; i0++)
            {
                for (int i1 = 0; i1 < N; i1++)
                {
                    if (i1 == i0) continue;
                    for (int i2 = 0; i2 < N; i2++)
                    {
                        if (i2 == i1 || i2 == i0) continue;
                        for (int i3 = 0; i3 < N; i3++)
                        {
                            if (i3 == i2 || i3 == i1 || i3 == i0) continue;
&nb