正文

【原创】谁是小偷?一道推理题的C语言描述2009-12-07 04:05:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/shenjinggege/50268.html

分享到:

题目: a说:“我不是小偷。”b说:“c是小偷。”c说:“小偷肯定是d。”d说:“c冤枉人!”四人中有三人说的是真话,问到底谁是小偷。 #include <stdio.h>#define N_PEOPLE 4    //定义人的个数#define NUM_OF_TRUTH 3    //说真话人的个数int main(){    int hypothesis[N_PEOPLE]; //定义数组来描述假设,1表示真话,0表示假话    int num_of_true[N_PEOPLE]={0,0,0,0};    int i,j;    int judge(int index,int hypothesis[]);        //假设其中一个人是小偷,比如A是小偷,看几个人的描述跟这个假设吻合    //如果有三个描述和假设吻合,则假设成立,这个人就是小偷    //下面的循环从假设A是小偷开始一直到D,计算和假设吻合的描述个数    for(i=0;i<N_PEOPLE;i++)    {        //被假设成小偷的人被赋值成1,假设不是小偷的赋值成0        for(j=0;j<N_PEOPLE;j++)            if(j==i)                hypothesis[j]=1;            else                hypothesis[j]=0;        //根据假设,求得符合假设的描述的个数        for(j=0;j<N_PEOPLE;j++)            num_of_true[i]+=judge(j,hypothesis);    }        for(i=0;i<N_PEOPLE;i++)        printf("如果%c是小偷,则说真话的人的个数是%d。\n",65+i,num_of_true[i]);    printf("结论:\n");    for(i=0;i<N_PEOPLE;i++)        if(num_of_true[i]==NUM_OF_TRUTH)            printf("由题目所示,3人说了真话,所以,%c是小偷。\n",65+i);    getchar();    return 0;}//这个函数来判断某一个人的描述是否和假设吻合,//如果吻合返回1,否则返回0//所有的描述被翻译成了代码//比如A是小偷则hypothesis[0]=1,//A不是小偷则hypothesis[0]=0//以此类推翻译所有4个人的描述为代码int judge(int index,int hypothesis[]){    int true_or_false;    switch(index)    {    case 0:        true_or_false=(hypothesis[0]==0);        break;    case 1:        true_or_false=(hypothesis[2]==1);        break;    case 2:        true_or_false=(hypothesis[3]==1);        break;    case 3:        true_or_false=(hypothesis[3]==0);        break;    }    return true_or_false;}输出结果如下:如果A是小偷,则说真话的人的个数是1。如果B是小偷,则说真话的人的个数是2。如果C是小偷,则说真话的人的个数是3。如果D是小偷,则说真话的人的个数是2。结论:由题目所示,3人说了真话,所以,C是小偷。

阅读(2709) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册