C趣味程序百例(16)迷语博士的难题(2)

C趣味程序百例(16)迷语博士的难题(2),第1张

C趣味程序百例(16)迷语博士的难题(2),第2张

54.谜题博士(2)
双面人是荒岛上的新人类。他们的特点是说的话真假难辨,真假交替。如果第一句为真,第二句为假;第一句为假,第二句为真,但第一句真假没有规律。
米语博士遇到了三个人,知道他们来自三个不同的民族:老实人、骗子、双面人。三个人并排站在医生面前。
医生问左边的人,“中间的人是什么种族?”左边的人回答:“老实”。
医生问中间的人:“你是哪个种族的?”中间那个人回答:“两面”。
医生问右边的人,“中间的人是什么种族?”右边的人回答:“骗子”。
请问:这三个人是什么国籍?
*问题分析及算法设计
这个问题是两面派家庭中最基本的问题,比之前只有诚信家庭和骗子家庭的问题更复杂。解题时要用变量分别表示这三个民族。
顺序:变量A=1表示左边的人老实(在C语言中表示为A);
变量B=1表示中间的人比较老实(C语言用B表示);
变量C=1表示右边的人老实(用C语言表示为C);
变量AA=1表示左边的人是两面派(C语言中表示为AA);
变量BB=1表示中间的人是两面派(C语言中的BB);
变量CC=1表示右边的人是双面家庭(C语言表示为CC);
那么左边的人就是骗子,可以表述为:A!=1和AA!=1(不老实两面派的人)
用C语言表示为:!一&&!AA
中间的人是骗子,可以表述为:B!=1和BB!=1
在C语言中表示为:!B&&!BB
右边的人是骗子,可以表述为:C!=0和CC!=1
在C语言中表示为:!C&&!CC
根据题目中“三个民族三个人”的条件,可以列为:
a+aa!=2&&b+bb!=2&&c+cc!=2和a+b+c==1&&aa+bb+cc==1
根据左边的人的回答可以推断,如果是老实人,中间的人也是老实人;如果他不老实,中间的人也不老实。以上条件可以表示为:
c&& b&&!bb||(!c&&!cc)&&(b||bb)||!C&&cc
把所有的逻辑条件组合起来,用穷举法求解。使上述条件同时成立的变量的值就是问题的答案。
*程序和程序注释
# include
void main()
{
int a,b,c,aa,bb,cc;
for(a = 0;a for(b = 0;b for(c = 0;c for(aa = 0;aa for(bb = 0;bb for(cc = 0;cc if(a+aa!=2&&b+bb!=2&&c+cc!=2&& /*判断逻辑条件*/
A+b+ C = = 1 & & AA+B b+ CC = = 1 &
(A & & AA & & B & &!bb||!一&&!b)&&
!b &&

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C趣味程序百例(16)迷语博士的难题(2)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情