本文目錄一覽:
- 1、愛因斯坦的2%人做得出那題目有幾種答案!?
- 2、愛因斯坦智商測試,請用C語言編程解決問題。
- 3、愛因斯坦出了一道題,他說世界上有90%的人回答不出,看看你是否屬於10%。
- 4、c語言愛因斯坦 誰養魚
- 5、如何用語言解決這個問題
愛因斯坦的2%人做得出那題目有幾種答案!?
2%?開玩笑。。。
詳盡的推導如下
首先,利用房子突破
根據9,挪威人住第一間,
14挪威人旁邊是藍色房子,得到,藍色房子是第二間
再根據4綠色在白色房子左邊,綠色和白色都不可能是第一間。
根據1,英國人是紅色,則紅色也不是第一間。那麼只剩下黃色是第一間。
再根據4綠色在白色左邊,那麼中間的房間只可能是綠色和紅色中的一個,
但是5綠色喝咖啡,8中間喝牛奶,證明中間不是綠色,那就必然是紅色咯,
好,至此,房子順序確定,為黃,藍,紅,綠白
而且我們知道,第一間是挪威人,抽Dunhill(7),第二間的人養馬(11),第三間是英國人,喝牛奶,第四間的人喝咖啡(5)。
至此還能對我們有幫助的條件就只剩下
2 3 6 10 12 13 15
好,根據3丹麥人喝茶,丹麥人必然只能是2號或者5號(因為1是挪威人,3,4喝的都不是茶)
根據12抽Blue Master的人喝啤酒,他必然只能是2號或者5號(1號抽Dunhill,34喝的不是啤酒)
那麼,2號和5號必然一個喝啤酒一個和茶,剩下的喝水,就只能是1號了。
根據15,可知2號抽Blends煙,那麼喝啤酒抽BM煙(條件12描述)的人只能是5號了
那麼丹麥人喝茶,抽Blends,養馬,住第二間藍色,確定。
好,至此,飲料的問題解決了
再根據13,德國人抽Prince,只能是4號,因為125號的煙已經知道了,而三號是英國人。所以最後剩下的5號就是瑞典人,國籍解決,剩下的3號抽Pall Mall,煙草解決
由6,pall Mall養鳥,則3號浮出水面,中間房子,紅色,英國人,養鳥,喝奶,抽Pall Mall
再根據2, 5號人物確定,最後一間房,白色,瑞典人,啤酒,養狗,抽Blue Master。
再根據10,明顯2號隔壁養貓,而三號不養貓,則1號養貓,1號,黃色,挪威人,喝水,養貓,抽Dunhill。最後剩下的就是4號,德國人,綠色房子,喝咖啡,抽Prince,養魚。
以上推導,步步嚴密,不存在第二種可能,所以答案唯一,就是德國人,不存在第二種可能。
本題只有一個答案,lz的丹麥肯定錯了
使用計算機窮舉法解決這個題目。剛剛經過6610秒的程序運行,完成了窮舉。事實是,根據窮舉法的結果,在所有120*120*120*120*120種可能(每一項都是5種的全排列)裏面,只有一種可能滿足題目要求。根本找不到第二種答案。強烈要求樓主將自己的丹麥的答案細節發出!
源程序:(C語言)
#include stdio.h
void printls(int s[5][5])
{
FILE *pout;
int i,j;
pout=fopen(“res.txt”,”w+”);
for(i=0;i5;i++)
{
for(j=0;j5;j++)
{
printf(“%d “,s[i][j]);
fprintf(pout,”%d “,s[i][j]);
}
printf(“\n”);
fprintf(pout,”\n”);
}
fclose(pout);
}
int check(int s[5][5])
{
int i,j;
//1
for(i=0;i5;i++){if(s[i][0]==0)break;}
if(s[i][1]!=0)return 0;
//2
for(i=0;i5;i++){if(s[i][1]==4)break;}
if(s[i][4]!=2)return 0;
//3
for(i=0;i5;i++){if(s[i][1]==3)break;}
if(s[i][2]!=2)return 0;
//4
for(i=0;i5;i++){if(s[i][0]==3)break;}
if(i==4)return 0;
if(s[i+1][0]!=2)return 0;
//5
if(s[i][2]!=4)return 0;
//6
for(i=0;i5;i++){if(s[i][3]==2)break;}
if(s[i][4]!=1)return 0;
//7
for(i=0;i5;i++){if(s[i][0]==1)break;}
if(s[i][3]!=3)return 0;
//8
if(s[2][2]!=1)return 0;
//9
if(s[0][1]!=1)return 0;
//10
for(i=0;i5;i++){if(s[i][3]==0)break;}
if(i==0){if(s[1][4]!=3)return 0;}
else if(i==4){if(s[3][4]!=3)return 0;}
else {if((s[i+1][4]!=3)(s[i-1][4]!=3))return 0;}
//11
for(i=0;i5;i++){if(s[i][4]==0)break;}
if(i==0){if(s[1][3]!=3)return 0;}
else if(i==4){if(s[3][3]!=3)return 0;}
else {if((s[i+1][3]!=3)(s[i-1][3]!=3))return 0;}
//12
for(i=0;i5;i++){if(s[i][3]==1)break;}
if(s[i][2]!=0)return 0;
//13
for(i=0;i5;i++){if(s[i][1]==2)break;}
if(s[i][3]!=4)return 0;
//14
for(i=0;i5;i++){if(s[i][1]==1)break;}
if(i==0){if(s[1][0]!=4)return 0;}
else if(i==4){if(s[3][0]!=4)return 0;}
else {if((s[i+1][0]!=4)(s[i-1][0]!=4))return 0;}
//15
for(i=0;i5;i++){if(s[i][3]==0)break;}
if(i==0){if(s[1][2]!=3)return 0;}
else if(i==4){if(s[3][2]!=3)return 0;}
else {if((s[i+1][2]!=3)(s[i-1][2]!=3))return 0;}
//if right
printls(s);
printf(“\n”);
return 1;
}
int main()
{
int s[5][5],i,j,k,l,m,n,p[121][5],o;
o = 0;
i = 0;
for(p[i][0]=0;p[i][0]5;p[i][0]++)
{
for(p[i][1]=0;p[i][1]5;p[i][1]++)
{
for(p[i][2]=0;p[i][2]5;p[i][2]++)
{
for(p[i][3]=0;p[i][3]5;p[i][3]++)
{
for(p[i][4]=0;p[i][4]5;p[i][4]++)
{
if(p[i][0]==p[i][1])continue;
if(p[i][0]==p[i][2])continue;
if(p[i][0]==p[i][3])continue;
if(p[i][0]==p[i][4])continue;
if(p[i][1]==p[i][2])continue;
if(p[i][1]==p[i][3])continue;
if(p[i][1]==p[i][4])continue;
if(p[i][2]==p[i][3])continue;
if(p[i][2]==p[i][4])continue;
if(p[i][3]==p[i][4])continue;
printf(“%d %d %d %d %d\n”,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4]);
i++;
printf(“%d\n”,i);
if(i==120)break;
for(j=0;j5;j++)p[i][j]=p[i-1][j];
}if(i==120)break;
}if(i==120)break;
}if(i==120)break;
}if(i==120)break;
}
printf(“%d\n”,i);
for(i=0;i120;i++)
{
for(j=0;j120;j++)
{
for(k=0;k120;k++)
{
for(l=0;l120;l++)
{
for(m=0;m120;m++)
{
for(n=0;n5;n++)
{
s[n][0]=p[i][n];
}
for(n=0;n5;n++)
{
s[n][1]=p[j][n];
}
for(n=0;n5;n++)
{
s[n][2]=p[k][n];
}
for(n=0;n5;n++)
{
s[n][3]=p[l][n];
}
for(n=0;n5;n++)
{
s[n][4]=p[m][n];
}
o+= check(s);
}
}
}
printf(“%d %d %d\n”,i,j,o);
}
}
printf(“%d end\n”,o);
return 0;
}
其中用到的代碼列表:
0 1 2 3 4
紅色 黃色 白色 綠色 藍色 0
英國 挪威 德國 丹麥 瑞典 1
啤酒 牛奶 茶 水 咖啡 2
Blen Blue Pall Dunh Prin 3
馬 鳥 狗 貓 魚 4
就是說數組s[i][j]每個i代表一個位置,每個j代表一種事物,具體代表什麼可以查上面這個表。例如s[2][3]=4就代表中間那所房子(s[i][j]的i=2,所以房子號是第三個,就是中間的)裏面的人抽的煙(s[i][j]中j=3,就是對應上表中最後標3的那行)是prince(標3的那行標4的那列是prince),再例如s[1][0]=2就代表第二座房子是白色的。
程序運行結果:
1 end (代表o=1,就是只找到一個解)
return code 0
Execution time 6609.68 seconds
文件輸出的結果:
1 1 3 3 3
4 3 2 0 0
0 0 1 2 1
3 2 4 4 4
2 4 0 1 2
按照上面的表格給出翻譯為
第一所房子 黃色 挪威 水 Dunhill 貓
第二所房子 藍色 丹麥 茶 Blends 馬
第三所房子 紅色 英國 牛奶 PallMall 鳥
第四所房子 綠色 德國 咖啡 Prince 魚
第五所房子 白色 瑞典 啤酒 BlueMast 狗
這次是程序窮舉法驗證,不知道樓主還有什麼可說的。。。如果您真的找到第二種答案,把它的細節列表發出來,大家看一看啊
愛因斯坦智商測試,請用C語言編程解決問題。
問:鄰居這個問題出自愛因斯坦,據他說,98%的人都做不出來。
有一排五間房子,每一間房子的顏色都不同。在這些房子里住着五個不同國籍的人。每個人餵養了不同的動物,喜歡不同的飲料,抽不同的雪茄。
英國人住在紅色房子里。
瑞典人養狗。
丹麥人喝茶。
綠色的房子在白色房子的左邊。
綠色房子的主人喜歡喝咖啡。
抽「坡魔」牌雪茄的人養鳥。
黃色房子的主人抽「頓山」牌雪茄。
住在中間房子的人喝牛奶。
挪威人住在第一間房子。
抽「波蘭斯」牌雪茄的人住在養貓的人旁邊。
養馬的人住在抽「頓山」牌雪茄的人旁邊。
抽「藍領」牌雪茄的人喝啤酒。
德國人抽「王子」牌雪茄。
挪威人住在藍色房子旁邊。
抽「波蘭斯」牌雪茄的人有一個喝水的鄰居。誰家養魚?
你是那2%的人嗎?
分析過程:
首先我們可以知道挪威人在1號房子 喝牛奶的人在3號房子
《挪威人住在藍色房子旁邊。》
1號挪威人旁邊只有一個房子 所以2號房子是藍色
《綠色的房子在白色房子的左邊。
綠色房子的主人喜歡喝咖啡》
此問題可以讓我們知道如果1號是綠那麼2號就是白但是2號是藍色
如果3號是綠色也不行 因為綠色房間的人喝咖啡 但3號喝牛奶
所以只有4號是綠色5號是白色就可以說得通了 (注意!就此地可以改所有的答案,這裡沒說綠色在白色的隔壁,這只是愛因斯坦的陷阱,其實有兩種答案,我們假設是隔壁,這是一種)
《英國人住在紅色房子里。》現在沒顏色的只有1號和3號怎麼知道誰是紅色呢?很簡單 就是看國籍1號是挪威人不是英國人 那3號
房子就是紅色主人是英國人 1號是黃色房間
1 2 3 4 5
挪威人 英國
紅色 藍色 黃色 綠色 白色
牛奶 咖啡
就下來有一個明顯的信息 就是《黃色房子的主人抽「頓山」牌雪茄。》
1號是紅色房間那麼他抽頓山 接下來有一個像《挪威人住在藍色房子旁邊。》的問題就是《養馬的人住在抽「頓山」牌雪茄的人旁邊》
這個也很簡單 就是紅色房間是1號 他只有一個鄰居就是2號
所以2號養馬
1 2 3 4 5
挪威人 英國
紅色 藍色 黃色 綠色 白色
牛奶 咖啡
馬
頓山
接下來才到了愛因斯坦說過的《98%人做不出》的難度了
我們先把一個可以知道的信息找出來就是
丹麥人喝茶。
抽「波蘭斯」牌雪茄的人有一個喝水的鄰居。
抽「藍領」牌雪茄的人喝啤酒
這三個問題中都有水 我們先看看它們每個都是幾號房子的人要喝
丹麥人可能是2 4 5號房子 因為他喝茶所以可以排除4號 那丹麥就是2 5號房中的一個
1號不抽波蘭斯 可以排除(排除他不是抽波蘭斯 但它可能是喝水的)5號的鄰居(4號)喝咖啡可以排除(4號)3號又喝牛奶所以喝水的人可能是1 2 5號房間中的一個
1號不抽藍領可以排除 3號喝牛奶可以排除 4號喝咖啡可以排除所以喝啤酒的人可能是2 5號
1 5 2號可能喝水
2 5號可能喝茶
2 5號可能喝啤酒
這一點要注意了 喝水的只能是1號 因為大家想想 如果5號喝水2號喝茶 要是這樣的話啤酒就誰喝呢?1號?不可能因為已經被排除了 如果2號喝水也一樣 所以1號喝水
1 2 3 4 5
挪威人 英國
紅色 藍色 黃色 綠色 白色
水 牛奶 咖啡
馬
頓山
接下來我們分析《抽「波蘭斯」牌雪茄的人有一個喝水的鄰居。》
1號喝水 那麼他只有一個鄰居 就是2號 所以2號抽波蘭斯
1 2 3 4 5
挪威人 英國
紅色 藍色 黃色 綠色 白色
水 牛奶 咖啡
馬
頓山 波蘭斯
用同樣的方法排除:
抽「藍領」牌雪茄的人喝啤酒
德國人抽「王子」牌雪茄
抽「坡魔」牌雪茄的人養鳥。
首先我們看藍領 1號抽煙喝水 那不是他 2號抽波蘭斯 不是他
3號喝牛奶也不是 4號喝咖啡也一樣 只有5號的人可以說得通
現在是德國人的 1號是挪威人抽頓山 不是 2號波蘭斯 不是
3號是英國人 不是 5號抽藍領也不是 所以只有4號說得通
《抽「坡魔」牌雪茄的人養鳥》現在這個不用分析了 因為只有3號要抽的煙還沒找到所以只有他抽坡魔了 並且養鳥
1 2 3 4 5
挪威 英國 德國
紅色 藍色 黃色 綠色 白色
水 牛奶 咖啡 啤酒
馬 鳥
頓山 波蘭斯 坡魔 王子 藍領
《抽「波蘭斯」牌雪茄的人住在養貓的人旁邊》
2號抽波蘭斯 他又兩個鄰居 一個是1號一個是3號 3號養鳥 所以不是他 那只有1號了
《瑞典人養狗。》
1號養貓的挪威人不可能 2號養馬 不是 3號英國人養鳥不是
4號德國人 也不是 就只有5號是瑞典人了 那2號是丹麥人喝茶
就剩下一個4號沒養寵物了 那麼他當然是養 魚
1 2 3 4 5
挪威 丹麥 英國 德國 瑞典
紅色 藍色 黃色 綠色 白色
水 茶 牛奶 咖啡 啤酒
貓 馬 鳥 魚 狗
頓山 波蘭斯 坡魔 王子 藍領
樓主我發誓這是我親手寫的!!!!!! 求最佳!!!!!
愛因斯坦出了一道題,他說世界上有90%的人回答不出,看看你是否屬於10%。
呵呵,很典型的一個計算機推理題,有類似的程序,看看這個對你有啟發,這個是一個釣魚的推斷程序:
/** 這道迷題出自1981年柏林的德國邏輯思考學院
* 原題為:
1.有5棟5種顏色的房子
2.每一位房子的主人國籍都不同
3.這五個人每人只喝一個牌子的飲料,只抽一個牌子的香煙,只養一種寵物
4.沒有人有相同的寵物,抽相同牌子的煙,喝相同牌子的飲料
已知條件:
1.英國人住在紅房子里
2.瑞典人養了一條狗
3.丹麥人喝茶
4.綠房子在白房子的左邊
5.綠房子主人喝咖啡
6.抽pallmall煙的人養了一隻鳥
7.黃房子主人抽dunhill煙
8.住在中間房子的人喝牛奶
9.挪威人住在第一間房子
10.抽混合煙的人住在養貓人的旁邊
11.養馬人住在抽dunhill煙人的旁邊
12.抽bluemaster煙的人喝啤酒
13.德國人抽prince煙
14.挪威人住在藍房子旁邊
15.抽混合煙的人的鄰居喝礦泉水
問題:誰養魚?
據說世界上只有2%的人能出答案。
就連大名鼎鼎的愛因斯坦也成為此題大傷腦筋。
*/
/*
* @author cds
*
* TODO To change the template for this generated type comment go to Window –
* Preferences – Java – Code Style – Code Templates
*/
public class WhoFeedsFish {
public static final int NATIONALITY_ENGLISH = 1;
public static final int NATIONALITY_SWIDISH = 2;
public static final int NATIONALITY_DAMARK = 3;
public static final int NATIONALITY_NORWAY = 4;
public static final int NATIONALITY_GERMAN = 5;
private int[] nationalities = { 1, 2, 3, 4, 5 };
public static final int COLOR_RED = 1;
public static final int COLOR_GREEN = 2;
public static final int COLOR_YELLOW = 3;
public static final int COLOR_WHITE = 4;
public static final int COLOR_BLUE = 5;
private int[] colors = { 1, 2, 3, 4, 5 };
public static final int PET_DOG = 1;
public static final int PET_BIRD = 2;
public static final int PET_CAT = 3;
public static final int PET_HORSE = 4;
public static final int PET_FISH = 5;
private int[] pets = { 1, 2, 3, 4, 5 };
public static final int DRINK_TEA = 1;
public static final int DRINK_COFFEE = 2;
public static final int DRINK_MILK = 3;
public static final int DRINK_BEER = 4;
public static final int DRINK_WATER = 5;
private int[] drinks = { 1, 2, 3, 4, 5 };
public static final int TOBACCO_PALLMALL = 1;
public static final int TOBACCO_DUNHILL = 2;
public static final int TOBACCO_BLUEMASTER = 3;
public static final int TOBACCO_PRINCE = 4;
public static final int TOBACCO_MIXED = 5;
private int[] tobaccoes = { 1, 2, 3, 4, 5 };
private int[][] key = { nationalities, colors, pets, drinks, tobaccoes };
private int[][] values = { { 1, 2, 3, 4, 5 }, { 1, 2, 3, 5, 4 },
{ 1, 2, 4, 3, 5 }, { 1, 2, 4, 5, 3 }, { 1, 2, 5, 3, 4 },
{ 1, 2, 5, 4, 3 }, { 1, 3, 2, 4, 5 }, { 1, 3, 2, 5, 4 },
{ 1, 3, 4, 2, 5 }, { 1, 3, 4, 5, 2 }, { 1, 3, 5, 2, 4 },
{ 1, 3, 5, 4, 2 }, { 1, 4, 2, 3, 5 }, { 1, 4, 2, 5, 3 },
{ 1, 4, 3, 2, 5 }, { 1, 4, 3, 5, 2 }, { 1, 4, 5, 2, 3 },
{ 1, 4, 5, 3, 2 }, { 1, 5, 2, 3, 4 }, { 1, 5, 2, 4, 3 },
{ 1, 5, 3, 2, 4 }, { 1, 5, 3, 4, 2 }, { 1, 5, 4, 2, 3 },
{ 1, 5, 4, 3, 2 }, { 2, 1, 3, 4, 5 }, { 2, 1, 3, 5, 4 },
{ 2, 1, 4, 3, 5 }, { 2, 1, 4, 5, 3 }, { 2, 1, 5, 3, 4 },
{ 2, 1, 5, 4, 3 }, { 2, 3, 1, 4, 5 }, { 2, 3, 1, 5, 4 },
{ 2, 3, 4, 1, 5 }, { 2, 3, 4, 5, 1 }, { 2, 3, 5, 1, 4 },
{ 2, 3, 5, 4, 1 }, { 2, 4, 1, 3, 5 }, { 2, 4, 1, 5, 3 },
{ 2, 4, 3, 1, 5 }, { 2, 4, 3, 5, 1 }, { 2, 4, 5, 1, 3 },
{ 2, 4, 5, 3, 1 }, { 2, 5, 1, 3, 4 }, { 2, 5, 1, 4, 3 },
{ 2, 5, 3, 1, 4 }, { 2, 5, 3, 4, 1 }, { 2, 5, 4, 1, 3 },
{ 2, 5, 4, 3, 1 }, { 3, 1, 2, 4, 5 }, { 3, 1, 2, 5, 4 },
{ 3, 1, 4, 2, 5 }, { 3, 1, 4, 5, 2 }, { 3, 1, 5, 2, 4 },
{ 3, 1, 5, 4, 2 }, { 3, 2, 1, 4, 5 }, { 3, 2, 1, 5, 4 },
{ 3, 2, 4, 1, 5 }, { 3, 2, 4, 5, 1 }, { 3, 2, 5, 1, 4 },
{ 3, 2, 5, 4, 1 }, { 3, 4, 1, 2, 5 }, { 3, 4, 1, 5, 2 },
{ 3, 4, 2, 1, 5 }, { 3, 4, 2, 5, 1 }, { 3, 4, 5, 1, 2 },
{ 3, 4, 5, 2, 1 }, { 3, 5, 1, 2, 4 }, { 3, 5, 1, 4, 2 },
{ 3, 5, 2, 1, 4 }, { 3, 5, 2, 4, 1 }, { 3, 5, 4, 1, 2 },
{ 3, 5, 4, 2, 1 }, { 4, 1, 2, 3, 5 }, { 4, 1, 2, 5, 3 },
{ 4, 1, 3, 2, 5 }, { 4, 1, 3, 5, 2 }, { 4, 1, 5, 2, 3 },
{ 4, 1, 5, 3, 2 }, { 4, 2, 1, 3, 5 }, { 4, 2, 1, 5, 3 },
{ 4, 2, 3, 1, 5 }, { 4, 2, 3, 5, 1 }, { 4, 2, 5, 1, 3 },
{ 4, 2, 5, 3, 1 }, { 4, 3, 1, 2, 5 }, { 4, 3, 1, 5, 2 },
{ 4, 3, 2, 1, 5 }, { 4, 3, 2, 5, 1 }, { 4, 3, 5, 1, 2 },
{ 4, 3, 5, 2, 1 }, { 4, 5, 1, 2, 3 }, { 4, 5, 1, 3, 2 },
{ 4, 5, 2, 1, 3 }, { 4, 5, 2, 3, 1 }, { 4, 5, 3, 1, 2 },
{ 4, 5, 3, 2, 1 }, { 5, 1, 2, 3, 4 }, { 5, 1, 2, 4, 3 },
{ 5, 1, 3, 2, 4 }, { 5, 1, 3, 4, 2 }, { 5, 1, 4, 2, 3 },
{ 5, 1, 4, 3, 2 }, { 5, 2, 1, 3, 4 }, { 5, 2, 1, 4, 3 },
{ 5, 2, 3, 1, 4 }, { 5, 2, 3, 4, 1 }, { 5, 2, 4, 1, 3 },
{ 5, 2, 4, 3, 1 }, { 5, 3, 1, 2, 4 }, { 5, 3, 1, 4, 2 },
{ 5, 3, 2, 1, 4 }, { 5, 3, 2, 4, 1 }, { 5, 3, 4, 1, 2 },
{ 5, 3, 4, 2, 1 }, { 5, 4, 1, 2, 3 }, { 5, 4, 1, 3, 2 },
{ 5, 4, 2, 1, 3 }, { 5, 4, 2, 3, 1 }, { 5, 4, 3, 1, 2 },
{ 5, 4, 3, 2, 1 } };
public void printKey() {
for (int i = 0; i 5; i++) {
print(“nationality”, key[0][i]);
}
System.out.println();
for (int i = 0; i 5; i++) {
print(“color”, key[1][i]);
}
System.out.println();
for (int i = 0; i 5; i++) {
print(“pet”, key[2][i]);
}
System.out.println();
for (int i = 0; i 5; i++) {
print(“drink”, key[3][i]);
}
System.out.println();
for (int i = 0; i 5; i++) {
print(“tobacco”, key[4][i]);
}
System.out.println();
}
public void print(String item, int index) {
if (false) {
} else if (“nationality”.equals(item)) {
switch (index) {
case 1:
System.out.print(“英國人\t\t”);
break;
case 2:
System.out.print(“瑞典人\t\t”);
break;
case 3:
System.out.print(“丹麥人\t\t”);
break;
case 4:
System.out.print(“挪威人\t\t”);
break;
case 5:
System.out.print(“德國人\t\t”);
break;
}
} else if (“color”.equals(item)) {
switch (index) {
case 1:
System.out.print(“紅房子\t\t”);
break;
case 2:
System.out.print(“綠房子\t\t”);
break;
case 3:
System.out.print(“黃房子\t\t”);
break;
case 4:
System.out.print(“白房子\t\t”);
break;
case 5:
System.out.print(“藍房子\t\t”);
break;
}
} else if (“pet”.equals(item)) {
switch (index) {
case 1:
System.out.print(“狗\t\t”);
break;
case 2:
System.out.print(“鳥\t\t”);
break;
case 3:
System.out.print(“貓\t\t”);
break;
case 4:
System.out.print(“馬\t\t”);
break;
case 5:
System.out.print(“魚\t\t”);
break;
}
} else if (“drink”.equals(item)) {
switch (index) {
case 1:
System.out.print(“茶\t\t”);
break;
case 2:
System.out.print(“咖啡\t\t”);
break;
case 3:
System.out.print(“牛奶\t\t”);
break;
case 4:
System.out.print(“啤酒\t\t”);
break;
case 5:
System.out.print(“水\t\t”);
break;
}
} else if (“tobacco”.equals(item)) {
switch (index) {
case 1:
System.out.print(“PALLMALL\t\t”);
break;
case 2:
System.out.print(“DUNHILL\t\t”);
break;
case 3:
System.out.print(“BLUEMASTER\t\t”);
break;
case 4:
System.out.print(“PRINCE\t\t”);
break;
case 5:
System.out.print(“混合煙\t\t”);
break;
}
}
}
private boolean check01() {
boolean ret = true;
// 條件1:英國人住在紅房子里 01
for (int i = 0; i nationalities.length; i++) {
if (key[0][i] == NATIONALITY_ENGLISH) {
if (key[1][i] != COLOR_RED) {
ret = false;
}
break;
}
}
return ret;
}
private boolean check02() {
boolean ret = true;
// 條件2:瑞典人養了一條狗 02
for (int i = 0; i nationalities.length; i++) {
if (key[0][i] == NATIONALITY_SWIDISH) {
if (key[2][i] != PET_DOG) {
ret = false;
}
break;
}
}
return ret;
}
private boolean check1() {
boolean ret = true;
// 條件4:綠房子在白房子的左邊 1
for (int i = 0; i colors.length; i++) {
if (key[1][i] == COLOR_GREEN) {
for (int j = 0; j colors.length; j++) {
if (key[1][j] == COLOR_WHITE) {
if (i j) {
ret = false;
}
break;
}
}
}
}
return ret;
}
private boolean check3() {
// 條件8:住在中間房子的人喝牛奶 3
return key[3][2] == DRINK_MILK ? true : false;
}
// 條件9:挪威人住在第一間房子 0
private boolean check0() {
if (key[0][0] != NATIONALITY_NORWAY) {
return false;
}
return true;
}
private boolean check011() {
// 14.挪威人住在藍房子旁邊 01
boolean ret = false;
for (int i = 0; i nationalities.length; i++) {
if (key[0][i] == NATIONALITY_NORWAY) {
for (int j = 0; j colors.length; j++) {
if (key[1][j] == COLOR_BLUE) {
if (Math.abs(i – j) == 1) {
return true;
} else {
return false;
}
}
}
}
}
return ret;
}
// /////////////////////////////////////////////////////////////////
private boolean check() {
boolean ret = true;
// 條件1:英國人住在紅房子里 01
ret = check01();
if (ret == false)
return false;
// 條件2:瑞典人養了一條狗 02
ret = check02();
if (ret == false)
return false;
// 條件3:丹麥人喝茶 03
for (int i = 0; i nationalities.length; i++) {
if (key[0][i] == NATIONALITY_DAMARK) {
if (key[3][i] != DRINK_TEA) {
return false;
} else {
break;
}
}
}
// 條件4:綠房子在白房子的左邊 1
ret = check1();
if (ret == false)
return false;
// 條件5:綠房子主人喝咖啡 13
for (int i = 0; i colors.length; i++) {
if (key[1][i] == COLOR_GREEN) {
if (key[3][i] != DRINK_COFFEE) {
return false;
} else {
break;
}
}
}
// 條件6:抽pallmall煙的人養了一隻鳥 24
for (int i = 0; i tobaccoes.length; i++) {
if (key[4][i] == TOBACCO_PALLMALL) {
if (key[2][i] != PET_BIRD) {
return false;
} else {
break;
}
}
}
// 條件7:黃房子主人抽dunhill煙 14
for (int i = 0; i colors.length; i++) {
if (key[1][i] == COLOR_YELLOW) {
if (key[4][i] != TOBACCO_DUNHILL) {
return false;
} else {
break;
}
}
}
// 條件8:住在中間房子的人喝牛奶 3
ret = check3();
if (ret == false)
return false;
// 條件9:挪威人住在第一間房子 0
ret = check0();
if (ret == false)
return false;
// 條件10:抽混合煙的人住在養貓人的旁邊 24
for (int i = 0; i tobaccoes.length; i++) {
if (key[4][i] == TOBACCO_MIXED) {
for (int j = 0; j pets.length; j++) {
if (key[2][j] == PET_CAT) {
if (i – j != 1 i – j != -1) {
return false;
}
break;
}
}
}
}
// 條件11:養馬人住在抽dunhill煙人的旁邊 24
for (int i = 0; i pets.length; i++) {
if (key[2][i] == PET_HORSE) {
for (int j = 0; j tobaccoes.length; j++) {
if (key[4][j] == TOBACCO_DUNHILL) {
if (i – j != 1 i – j != -1) {
return false;
}
break;
}
}
}
}
// 條件12:抽bluemaster煙的人喝啤酒 34
for (int i = 0; i tobaccoes.length; i++) {
if (key[4][i] == TOBACCO_BLUEMASTER) {
if (key[3][i] != DRINK_BEER) {
return false;
} else {
break;
}
}
}
// 13.德國人抽prince煙 04
for (int i = 0; i nationalities.length; i++) {
if (key[0][i] == NATIONALITY_GERMAN) {
if (key[4][i] != TOBACCO_PRINCE) {
return false;
} else {
break;
}
}
}
// 14.挪威人住在藍房子旁邊 01
ret = check011();
if (ret == false)
return false;
// 15.抽混合煙的人的鄰居喝礦泉水 34
for (int i = 0; i tobaccoes.length; i++) {
if (key[4][i] == TOBACCO_MIXED) {
for (int j = 0; j drinks.length; j++) {
if (key[3][j] == DRINK_WATER) {
if ((i – j != 1) (i – j != -1)) {
return false;
} else {
break;
}
}
}
}
}
return ret;
}
public void run() {
int count = 0;
for (int a = 0; a 120; a++) {
for (int i = 0; i 5; i++) {
key[0][i] = values[a][i];
}
if (!check0()) {
continue;
}
for (int b = 0; b 120; b++) {
for (int i = 0; i 5; i++) {
key[1][i] = values[b][i];
}
if (!check01() || !check011() || !check1()) {
continue;
}
for (int c = 0; c 120; c++) {
for (int i = 0; i 5; i++) {
key[2][i] = values[c][i];
}
if (!check02()) {
continue;
}
for (int d = 0; d 120; d++) {
for (int i = 0; i 5; i++) {
key[3][i] = values[d][i];
}
// if(!check()){continue;}
for (int e = 0; e 120; e++) {
for (int i = 0; i 5; i++) {
key[4][i] = values[e][i];
}
if (!check()) {
continue;
}
System.out.println(“答案” + (++count));
printKey();
System.out
.println(“———————————————–“);
}
}
}
}
}
}
public static void main(String[] args) {
WhoFeedsFish wff = new WhoFeedsFish();
System.out.println(“==========Start==========”);
wff.run();
System.out.println(“==========End==========”);
}
}
c語言愛因斯坦 誰養魚
#includestdio.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;i5;i++)
if(aa[i].guojia==2 aa[i].color==1)goto next1;
return 0;
next1:
for(i=0;i5;i++)
if(aa[i].guojia==5 aa[i].pads==1)goto next2;
return 0;
next2:
for(i=0;i5;i++)
if(aa[i].guojia==4 aa[i].drink==1)goto next3;
return 0;
next3:
for(i=0;i5;i++)
if(aa[i].color==3)goto next3_1;
return 0;
next3_1:
for(j=i+1;j5;j++)
if(aa[j].color==5)goto next4;
return 0;
next4:
for(i=0;i5;i++)
if(aa[i].color==3 aa[i].drink==3)goto next5;
return 0;
next5:
for(i=0;i5;i++)
if(aa[i].smoke==4 aa[i].pads==4)goto next6;
return 0;
next6:
for(i=0;i5;i++)
if(aa[i].color==2 aa[i].smoke==3)goto next7;
return 0;
next7:
for(i=0;i5;i++)
if(aa[i].guojia==3 aa[i].smoke==5)goto next10;
return 0;
next10:
for(i=0;i5;i++)
if(aa[i].smoke==2 aa[i].drink==4)goto next11;
return 0;
next11:
for(i=0;i5;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;i5;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;i5;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;k0;k–)
if(a[k-1]a[k])break;
if(k==0)
{ for(i=0,j=n-1;ij;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;jn;j++)
if(ta[j]a[j]a[i])i=j;
a[k-1]=a[i];a[i]=t;
for(i=k;in-1;i++)
for(j=k;jn-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;i124;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;i224;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;i324;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;i4120;i4++){
for(i=0;i5;i++)
aa[i].smoke=smoke[i];
rot(smoke,5);
for(i5=0;i5120;i5++){
for(j=0;j5;j++)
aa[j].pads=pads[j];
rot(pads,5);
if(OK()){
printf(“———————第%d種解———————\n”,++ans);
for(k=0;k5;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)位於最中間的屋主喝牛奶:可以得出第三間房子的主人喝的飲料是牛奶。
(2)挪威人住在第一間房屋裡:可以得出第一間房子的主人國籍是挪威人。
(3)挪威人住在藍色房子隔壁:可以得出第二間房子的主人房子的顏色是藍色。
(4)綠色的房子在白色的房子的左邊;綠色房屋的屋主喝咖啡:由於綠色房子和白色房子是連在一起的,所以現在可以選擇的房子顏色是3、4、5號,綠色房子和白色房子在這三間房子裏面;而綠色房子在白色房子的左邊,因此,若3號是綠色,4號就是白色,若4號是綠色,5號是白色,由於綠色房子的屋主喝咖啡,因此,綠色房子不可能是3號,因此,4號是綠色,5號是白色;第四間房子的主人喝的飲料是咖啡。
(5)英國人住在紅色房屋裡:1號房子是挪威人,因此1號排除,2、4、5號房子均有顏色,因此,3號房子是紅色的,國籍是英國人。
(6)黃色屋主抽Dunhill:剩餘的1號房子的顏色是黃色,房主抽的是Dunhill。
(7)養馬的屋主在抽Dunhill的人家的隔壁:抽Dunhill是1號,因此2號養馬。
(8)抽Blue Master的屋主喝啤酒:現在飲料和香煙都沒有確定的是2號和5號;假設:若5號是,5號房子主人和啤酒,抽Blue Master。
(9)在(8)假設成立的前提下,丹麥人喝茶:國籍和飲料都沒有確定的只有2號,因此,2號房主的國籍是丹麥人,喝的是茶。
(10)在(8)假設成立的前提下,德國人抽Prince:國籍沒有定的是4號和5號,而5號抽Blue Master,因此,4號房主是德國人,抽Prince。
(11)在(8)假設成立的前提下,瑞典人養了一隻狗:只剩下5號,因此,5號房主國籍是瑞典人,養狗。
(12)在(8)假設成立的前提下,抽Pall Mall香煙的屋主養鳥:香煙和寵物都沒有確定的只有3號,因此,3號房主抽Pall Mall,養鳥。
(13)在(8)假設成立的前提下,抽Blend的人住在養貓人家的隔壁:只剩下2號,因此,2號房主抽Blend,1號房主養貓。
(14)在(8)假設成立的前提下,只喝開水的人家住在抽Blend的隔壁:只剩下1號,1號房主喝的飲料是開水。
(15)最後剩一個就是養魚。
(16)因此,(8)的假設成立。
最後得到結論 德國人養的魚
原創文章,作者:UGUIW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/324974.html