第1个回答 2011-05-01
大概思想是:
do_judge(a,b,c,d)
{
if(check(a,!b,!c,!d)
{
return 1;//find solution
}
return do_judge(b,c,d,a);
}
check函数,满足条件返回为真,否则返回假!
函数do_judge的参数是每个假设条件
当为do_judge(a,b,c,d)时,
check(a,!b,!c,!d)代表:
a为真,b、c、d为假
当为do_judge(b,c,d,a)是
b为真,c、d、a为假
调用do_judge的堆栈情况
do_judge(a,b,c,d)
|
+do_judge(b,c,d,a)
|
+do_judge(c,d,a,b)
|
+do_judge(d,a,b,c)
这些调用中,最终会有一个返回一个真,所有不一定这些调用都会发生。
第2个回答 2011-05-01
首先要用程序语言写出来,那么你得先自己知道思路,第一题:抓主要矛盾,B和D的回答是明显的矛盾B说:4号赛车是最好的。D说:B说错了。两者回答只可能其中一人回答正确,那么这时候就假设,先假设B说对了,那么事实上的最好的车就是4号,再来推敲其他人的回答,看C说:3号不是最佳赛车。,那么C说对了,因为假设出来的最好车就是4号,不是3号,那么此时就有2人说对了,舍弃掉此假设。
B错就说明D说对了!D说:B说错了。言下之意就是4号赛车不是最好,那么此时又存在1,2,3号是最好的赛车的可能性,我们再来推敲每个人说的话,A说:2号赛车是最好的。判错掉A的回答,如果A说对就有2个人说对了,相应把2号车排除掉了。C说:3号不是最佳赛车。判错掉C的回答,同理C不能正确,那么相应的答案就是3号才是最号的赛车。
结果就是,4个专家中D说对了,3号车是最好的,至于代码自己完善吧
第3个回答 2011-05-01
受楼上的启发,写了第二题的答案,C-FREE测试通过:
#include<stdio.h>
int used[5];
int p[5];
int ii[5]={1,2,3,4,5};
void main( void )
{
int* Rank(int*);
void perm(int);
perm(0);
}
int* Rank(int * p){
/* for(int kk=0;kk<5;kk++)
printf("%d",p[kk]);
printf("\n");*/
if((1==!(p[1]-2)+!(p[0]-3))&&
(1==!(p[1]-2)+!(p[4]-4))&&
(1==!(p[2]-1)+!(p[3]-2))&&
(1==!(p[2]-5)+!(p[3]-3))&&
(1==!(p[4]-4)+!(p[0]-1))){
printf("最终名次为:");
for(int kk=0;kk<5;kk++)
printf("%d",p[kk]);
printf("\n");
}
}
void perm(int l) { //当前排第l个数
int i;
for (i=0; i<5; i++) {
if (!used[i]) { //如果某个数没排过
p[l] = ii[i]; //就排它
used[i] = true;
if (l==4)
Rank(p);
else perm(l+1); //如果数够了,则输出,否则排下一个
used[i] = false;
}
}
}
楼主也可以参考
http://apps.hi.baidu.com/share/detail/15787681