爱因斯坦谜题的c语言解答

Posted on Tue, 16 Mar 2010 02:10:25 -1100

[旧文搬迁]

题目如下,
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香烟的人有一个喝水的邻居


问题是:谁养鱼?

 以下是c语言的解答

#include <stdio.h>
#include <stdlib.h>
enum Nat
{
    ENG,SWE,DEN,NOR,GER
};
enum Hou
{
    RED,GREEN,WHITE,YELLOW,BLUE
};
enum Pet
{
    DOG,BIRD,CAT,HORSE,FISH
};
enum Dri
{
    TEA,COFFEE,MILK,BEER,WATER
};
enum Cig
{
    PALLMALL,DUNHILL,BLENDS,BLUEMASTER,PRINCE
};
struct S//scence
{
    int *nat; //nationality
    int *hou; //house
    int *pet; //pet
    int *dri; //drink
    int *cig; //cigar
} ;
void Permute(int a[120][5]) //permutation process
{
    int i=0,j=0,r1,r2,r3,r4,r5;
    for (r1=0;r1<5;r1++)
    {
        for (r2=0;r2<5;r2++)
        {
            if (r2!=r1)
                for (r3=0;r3<5;r3++)
                {
                    if (r3!=r2&&r3!=r1)
                        for (r4=0;r4<5;r4++)
                        {
                            if (r4!=r3&&r4!=r2&&r4!=r1)
                                for (r5=0;r5<5;r5++)
                                {
                                    if (r5!=r4&&r5!=r3&&r5!=r2&&r5!=r1)
                                    {
                                        a[i][j++]=r1;
                                        a[i][j++]=r2;
                                        a[i][j++]=r3;
                                        a[i][j++]=r4;
                                        a[i++][j]=r5;
                                        j=0;
                                    }
                                }
                        }
                }
        }
    }
//printf("\n***枚举过程完成***\n\n");
    return ;
}
int NatPos(struct S s,enum Nat t) //get position by nationality
{
    int i;
    for (i=0;i<5;i++)
        if (s.nat[i]==t)
            return i;
    return -1;
}
int HouPos(struct S s,enum Hou t) //get position by house
{
    int i;
    for (i=0;i<5;i++)
        if (s.hou[i]==t)
            return i;
    return -2;
}
int PetPos(struct S s,enum Pet t) //get position by pet
{
    int i;
    for (i=0;i<5;i++)
        if (s.pet[i]==t)
            return i;
    return -3;
}
int DriPos(struct S s,enum Dri t) //get position by drink
{
    int i;
    for (i=0;i<5;i++)
        if (s.dri[i]==t)
            return i;
    return -4;
}
int CigPos(struct S s,enum Cig t) //get position by cigar
{
    int i;
    for (i=0;i<5;i++)
        if (s.cig[i]==t)
            return i;
    return -5;
}
int main()
{
    int a[120][5];
    struct S s;
    int r1,r2,r3,r4,r5,i;
    Permute(a); //get permuted array
    for (s.dri=a[0],r1=0;r1<120;s.dri+=5,r1+=1) //permute 5 rounds for scene
    {
        if (s.dri[2]==MILK) //condition required
            for (s.nat=a[0],r2=0;r2<120;s.nat+=5,r2+=1)
            {
                if (s.nat[0]==NOR&&s.dri[NatPos(s,DEN)]==TEA) //condition required
                    for (s.hou=a[0],r3=0;r3<120;s.hou+=5,r3+=1)
                    {
                        if (s.hou[NatPos(s,ENG)]==RED&&s.dri[HouPos(s,GREEN)]==COFFEE&&
                            (HouPos(s,GREEN)+1==HouPos(s,WHITE))&&
                            ((NatPos(s,NOR)==HouPos(s,BLUE)+1)||(NatPos(s,NOR)==HouPos(s,BLUE)-1)))
                            for (s.pet=a[0],r4=0;r4<120;s.pet+=5,r4+=1)
                            {
                                if (s.pet[NatPos(s,SWE)]==DOG) //condition required
                                    for (s.cig=a[0],r5=0;r5<120;s.cig+=5,r5+=1)
                                    {
//<----
//////////////////////////////////////////////////////////////////
  if (((CigPos(s,BLENDS)==DriPos(s,WATER)+1)||(CigPos(s,BLENDS)==DriPos(s,WATER)-1))&&
       ((PetPos(s,HORSE)==CigPos(s,DUNHILL)+1)||(PetPos(s,HORSE)==CigPos(s,DUNHILL)-1))&&
        ((CigPos(s,BLENDS)==PetPos(s,CAT)+1)||(CigPos(s,BLENDS)==PetPos(s,CAT)-1))&&
           s.dri[CigPos(s,BLUEMASTER)]==BEER&&s.pet[CigPos(s,PALLMALL)]==BIRD&&
           s.cig[HouPos(s,YELLOW)]==DUNHILL&&s.cig[NatPos(s,GER)]==PRINCE)
          {
                        switch (s.nat[PetPos(s,FISH)])
                        {
                               case ENG:printf("***英国人养鱼***\n");break;
                               case SWE:printf("***瑞典人养鱼***\n");break;
                               case DEN:printf("***丹麦人养鱼***\n");break;
                               case NOR:printf("***挪威人养鱼***\n");break;
                               case GER:printf("***德国人养鱼***\n");break;
                               default:printf("***解不存在***\n");break;
                        }
                        printf("\n此时具体情况如下");
                        printf("\n\n*****************\n");
                        printf(" 标号 1 2 3 4 5 \n");
                        printf("\n 国籍 ");
                        for (i=0;i<5;i++)
                        {
                               switch (s.nat[i])
                               {
                                   case ENG:printf("英国 ");break;
                                   case SWE:printf("瑞典 ");break;
                                   case DEN:printf("丹麦 ");break;
                                   case NOR:printf("挪威 ");break;
                                   case GER:printf("德国 ");break;
                                   default:printf("错误 ");break;
                               };
                       }
                     printf("\n\n 房屋颜色 ");
                     for (i=0;i<5;i++)
                     {
                              switch (s.hou[i])
                              {
                                   case RED:printf("红色 ");break;
                                   case GREEN:printf("绿色 ");break;
                                   case WHITE:printf("白色 ");break;
                                   case YELLOW:printf("黄色 ");break;
                                   case BLUE:printf("蓝色 ");break;
                                   default:printf("错误 ");break;
                              };
                     }
                    printf("\n\n 宠物 ");
                    for (i=0;i<5;i++)
                    {
                             switch (s.pet[i])
                             {
                                   case DOG:printf("狗 ");break;
                                   case BIRD:printf("鸟 ");break;
                                   case CAT:printf("猫 ");break;
                                   case HORSE:printf("马 ");break;
                                   case FISH:printf("鱼 ");break;
                                   default:printf("错误 ");break;
                             };
                    }
                   printf("\n\n 饮品 ");
                   for (i=0;i<5;i++)
                  {
                             switch (s.dri[i])
                             {
                                    case TEA:printf("茶 ");break;
                                    case COFFEE:printf("咖啡 ");break;
                                    case MILK:printf("牛奶 ");break;
                                    case BEER:printf("啤酒 ");break;
                                    case WATER:printf("水 ");break;
                                    default:printf("错误 ");break;
                             };
                   }
                  printf("\n\n 香烟 ");
                  for (i=0;i<5;i++)
                  {
                             switch (s.cig[i])
                             {
                                    case PALLMALL:printf("帕玛 ");break;
                                    case DUNHILL:printf("杜希尔 ");break;
                                    case BLENDS:printf("布莱登 ");break;
                                    case BLUEMASTER:printf("布鲁玛 ");break;
                                    case PRINCE:printf("布里斯 ");break;
                                    default:printf("错误 ");break;
                             };
                    }
                    printf("\n\n*****************\n\n");
       }
                                    }
                            }
                    }
            }
    }
    return 0;
}