爱因斯坦难题的C语言程序设计

  • 来源: 编程中国 作者: 若水   2008-03-28/15:27
  • 题目是:
    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香烟的人有一个喝水的邻居

    问题是:谁养鱼?

    #include<stdio.h>
    char*COL[]={NULL,"红","黄","绿","蓝","白"};
    char*PAD[]={NULL,"狗","猫","鱼","鸟","马"};
    char*DRK[]={NULL,"茶  ","牛奶","咖啡","啤酒","水  "};
    char*GUO[]={NULL,"挪威","英国","德国","丹麦","瑞典"};
    char*SMK[]={NULL,"Blends","BlueMaster","Dunhill","Pall Mall","Prince"};
    struct{ char guojia, color, pads, drink, smoke; } aa[5];
    int OK(void)
    {
        int i,j;
        for(i=0;i<5;i++)
         if(aa[i].guojia==2 && aa[i].color==1)goto next1;
        return 0;
    next1:
        for(i=0;i<5;i++)
         if(aa[i].guojia==5 && aa[i].pads==1)goto next2;
        return 0;
    next2:    
        for(i=0;i<5;i++)
         if(aa[i].guojia==4 && aa[i].drink==1)goto next3;
        return 0;
    next3:
        for(i=0;i<5;i++)
         if(aa[i].color==3)goto next3_1;
        return 0;
    next3_1:
        for(j=i+1;j<5;j++)
         if(aa[j].color==5)goto next4;
        return 0;
    next4:
        for(i=0;i<5;i++)
         if(aa[i].color==3 && aa[i].drink==3)goto next5;
        return 0;
    next5:
        for(i=0;i<5;i++)
         if(aa[i].smoke==4 && aa[i].pads==4)goto next6;
        return 0;
    next6:
        for(i=0;i<5;i++)
         if(aa[i].color==2 && aa[i].smoke==3)goto next7;
        return 0;
    next7:
        for(i=0;i<5;i++)
         if(aa[i].guojia==3 && aa[i].smoke==5)goto next10;
        return 0;
    next10:
        for(i=0;i<5;i++)
         if(aa[i].smoke==2 && aa[i].drink==4)goto next11;
        return 0;
    next11:
        for(i=0;i<5;i++)
         if(aa[i].smoke==3)goto next12_1;
    next12_1:
        if(i==0){if(aa[1].pads==5)goto next13;}
        else if(i==4){if(aa[3].pads==5)goto next13;}
        else if(aa[i-1].pads==5||aa[i+1].pads==5)goto next13;
        return 0;
    next13:
        for(i=0;i<5;i++)
         if(aa[i].smoke==1)goto next13_1;
    next13_1:
        if(i==0){if(aa[1].pads==2)goto next14;}
        else if(i==4){if(aa[3].pads==2)goto next14;}
        else if(aa[i-1].pads==2||aa[i+1].pads==2)goto next14;
        return 0;
    next14:
        for(i=0;i<5;i++)
         if(aa[i].smoke==1)goto next14_1;
    next14_1:
        if(i==0){if(aa[1].drink==5)goto next15;}
        else if(i==4){if(aa[3].drink==5)goto next15;}
        else if(aa[i-1].drink==5||aa[i+1].drink==5)goto next15;
        return 0;
    next15:
        return 1;
    }

    char color[4]={1,2,3,5};
    char drink[4]={1,3,4,5};
    char guojia[4]={2,3,4,5};
    char smoke[]={1,2,3,4,5};
    char pads[5]={1,2,3,4,5};

    int rot(char a[],int n)
    {   int i,j,k,t;
        for(k=n-1;k>0;k--)
           if(a[k-1]<a[k])break;
        if(k==0)
        { for(i=0,j=n-1;i<j;i++,j--)
          {char t=a[i];
               a[i]=a[j];
               a[j]=t;#p#分页标题#e#
          }
          return 0;
        }
        t=a[k-1];i=k;
        for(j=k+1;j<n;j++)
          if(t<a[j]&&a[j]<a[i])i=j;
        a[k-1]=a[i];a[i]=t;
        for(i=k;i<n-1;i++)
          for(j=k;j<n-1+k-i;j++)
            if(a[j]>a[j+1])
            {  t=a[j];
               a[j]=a[j+1];
               a[j+1]=t;
            }
        return 1;
    }

    int main()
    {   int i,j,k,ans=0;
        int i1,i2,i3,i4,i5;
        aa[1].color=4;
        aa[2].drink=2;
        aa[0].guojia=1;
        for(i1=0;i1<24;i1++){
            aa[0].color=color[0];
            aa[2].color=color[1];
            aa[3].color=color[2];
            aa[4].color=color[3];
            rot(color,4);
        for(i2=0;i2<24;i2++){
            aa[0].drink=drink[0];
            aa[1].drink=drink[1];
            aa[3].drink=drink[2];
            aa[4].drink=drink[3];
            rot(drink,4);
        for(i3=0;i3<24;i3++){
            aa[1].guojia=guojia[0];
            aa[2].guojia=guojia[1];
            aa[3].guojia=guojia[2];
            aa[4].guojia=guojia[3];
            rot(guojia,4);
        for(i4=0;i4<120;i4++){
            for(i=0;i<5;i++)
            aa[i].smoke=smoke[i];
            rot(smoke,5);
        for(i5=0;i5<120;i5++){
            for(j=0;j<5;j++)
            aa[j].pads=pads[j];
            rot(pads,5);
            if(OK()){
            printf("---------------------第%d种解---------------------\n",++ans);
            for(k=0;k<5;k++)
            printf("第%d户: %s人 %s房子 养%s 喝%s 抽%s\n",k+1,GUO[aa[k].guojia],
            COL[aa[k].color],PAD[aa[k].pads],DRK[aa[k].drink],SMK[aa[k].smoke]);
        }}}}}}
        return 0;
    }

     运行结果表明:总共有七组可能的解答,具体如下
    ---------------------第1种解---------------------
    第1户: 挪威人 黄房子 养猫 喝水   抽Dunhill
    第2户: 丹麦人 蓝房子 养马 喝茶   抽Blends
    第3户: 英国人 红房子 养鸟 喝牛奶 抽Pall Mall
    第4户: 德国人 绿房子 养鱼 喝咖啡 抽Prince
    第5户: 瑞典人 白房子 养狗 喝啤酒 抽BlueMaster
    ---------------------第2种解---------------------
    第1户: 挪威人 绿房子 养鸟 喝咖啡 抽Pall Mall
    第2户: 德国人 蓝房子 养猫 喝水   抽Prince
    第3户: 英国人 红房子 养马 喝牛奶 抽Blends
    第4户: 丹麦人 黄房子 养鱼 喝茶   抽Dunhill
    第5户: 瑞典人 白房子 养狗 喝啤酒 抽BlueMaster
    ---------------------第3种解---------------------
    第1户: 挪威人 绿房子 养鸟 喝咖啡 抽Pall Mall
    第2户: 德国人 蓝房子 养鱼 喝水   抽Prince
    第3户: 英国人 红房子 养马 喝牛奶 抽Blends
    第4户: 丹麦人 黄房子 养猫 喝茶   抽Dunhill
    第5户: 瑞典人 白房子 养狗 喝啤酒 抽BlueMaster
    ---------------------第4种解---------------------
    第1户: 挪威人 绿房子 养鱼 喝咖啡 抽Blends
    第2户: 德国人 蓝房子 养猫 喝水   抽Prince
    第3户: 瑞典人 黄房子 养狗 喝牛奶 抽Dunhill
    第4户: 英国人 红房子 养马 喝啤酒 抽BlueMaster
    第5户: 丹麦人 白房子 养鸟 喝茶   抽Pall Mall
    ---------------------第5种解---------------------
    第1户: 挪威人 绿房子 养鸟 喝咖啡 抽Pall Mall
    第2户: 德国人 蓝房子 养猫 喝水   抽Prince
    第3户: 瑞典人 白房子 养狗 喝牛奶 抽Blends
    第4户: 英国人 红房子 养马 喝啤酒 抽BlueMaster#p#分页标题#e#
    第5户: 丹麦人 黄房子 养鱼 喝茶   抽Dunhill
    ---------------------第6种解---------------------
    第1户: 挪威人 绿房子 养鸟 喝咖啡 抽Pall Mall
    第2户: 德国人 蓝房子 养猫 喝水   抽Prince
    第3户: 瑞典人 白房子 养狗 喝牛奶 抽Blends
    第4户: 丹麦人 黄房子 养鱼 喝茶   抽Dunhill
    第5户: 英国人 红房子 养马 喝啤酒 抽BlueMaster
    ---------------------第7种解---------------------
    第1户: 挪威人 绿房子 养鸟 喝咖啡 抽Pall Mall
    第2户: 德国人 蓝房子 养鱼 喝水   抽Prince
    第3户: 瑞典人 白房子 养狗 喝牛奶 抽Blends
    第4户: 丹麦人 黄房子 养猫 喝茶   抽Dunhill
    第5户: 英国人 红房子 养马 喝啤酒 抽BlueMaster


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多