第22題:
有4張紅色的牌和4張藍色的牌,主持人先拿任意兩張,
再分別在A、B、C三人額頭上貼任意兩張牌,
A、B、C三人都可以看見其餘兩人額頭上的牌,
看完後讓他們猜自己額頭上是什麼顏色的牌,
A說不知道,B說不知道,C說不知道,然後A說知道了。
請教如何推理,A是怎麼知道的。如果用程序,又怎麼實現呢?
此題如果用計算機程序來模擬,那麼肯定是用枚舉,所有可能性來進行循環處理
分析:
4張 r 4張b
有以下3種組合:
rr bb rb
1.B,C全是一種顏色
B C A
bb.rr bb.rr
2.
B C A
bb rr bb/RR/BR,=>A:BR
rr bb =>A:BR
3.
B C A
BR BB RR/BR, =>A:BR
//推出A:BR的原因,
//如果 A是 RR,
//那麼,當ABC都說不知道後,B 最後應該知道自己是BR了。
//因爲B 不可能 是 RR或BB。
4.
B C A
BR BR BB/RR/BR
//推出A:BR的原因
//i、 如果,A是 BB,那麼B=>BR/RR,
//如果B=>RR,那麼一開始,C就該知道自己是BR了(A倆藍,B倆紅)。(如果C.A倆藍,那麼B就一開始知道,如果C.B倆紅,那麼A一開始就知道,所以,論證前頭,當B=>RR,那麼一開始,C就該知道自己是BR)。
//如果B=>BR,那麼,同樣道理,C一開始也該知道自己是BR了。
//ii、 如果A是RR....
//iii、最後,也還是推出=>A:BR
源代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char all[4][3]={"bb","br","rr"};
int main()
{
int i,j,k;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
{
int blue=0,red=0;
if(all[i][0]=='b')
blue+=1;
else
red+=1;
if(all[i][1]=='b')
blue+=1;
else
red+=1;
if(all[j][0]=='b')
blue+=1;
else
red+=1;
if(all[j][1]=='b')
blue+=1;
else
red+=1;
if(all[k][0]=='b')
blue+=1;
else
red+=1;
if(all[k][1]=='b')
blue+=1;
else
red+=1;
if(blue<4&&red<4)
{
if(strcmp(all[i],all[j])>0)
{
char word[3];
sprintf(word,"%s",all[i]);
sprintf(all[i],"%s",all[j]);
sprintf(all[j],"%s",word);
}
if(strcmp(all[i],all[k])>0)
{
char word[3];
sprintf(word,"%s",all[i]);
sprintf(all[i],"%s",all[k]);
sprintf(all[k],"%s",word);
}
if(strcmp(all[j],all[k])>0)
{
char word[3];
sprintf(word,"%s",all[j]);
sprintf(all[j],"%s",all[k]);
sprintf(all[k],"%s",word);
}
printf("%s %s %s \n",all[i],all[j],all[k]);
}
}
system("pause");
return 0;
}
最後其實有個重點就是,根據循環出來的B C狀態,來推A的可能性(即相加<=4即可),如果爲2,那麼說明A有兩種可能的情況,則A無法確定,不輸出,否則 ,輸出答案,後面是對A B C進行排序
最後得到只可能有一種答案 BB BR RR