爱因斯坦谜题的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; }