原帖及讨论:http://bbs.bccn.net/thread-185111-1-1.html */ -------------------------------------------------------------------------------------- */ 出自: 编程中国 http://www.bccn.net */ 作者: yu_hua */ 时间: 2007-11-10 编程论坛首发 */ 声明: 尊重作者劳动,转载请保留本段文字 */ --------------------------------------------------------------------------------------
题目是: 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; } 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 第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 |