编写C语言程序解决白帽子、红帽子问题

厅内有5个人,他们均戴着帽子--白帽子和红帽子,已知带白帽子的说真话,戴红帽子的说假话,请从他们各自提供的线索编程判断谁带白帽子,谁戴红帽子。
甲:我看见一个带白帽子的
乙:我没有看见戴红帽子的
丙:我看见一个带白帽子的,但不是甲
丁:我没有看见带白帽子的
戊:我的话和丙一样
编写C语言程序,找出谁带红帽子,谁带白帽子。

这个问题我用5位二进制数来表示,总的可能排列有32种,逐一检验就可以找到答案,具体看代码:

#include <stdio.h>
#include <conio.h>
#define N 5
int main(){
    unsigned int bin,max,i,w,hat[N]={0};
    for(max=1,i=0;i<N;++i)max*=2;//计算max=2^N
    for(bin=0;bin<max;++bin){//用N位二进制数表示每个人的帽子状态,bin=00000~11111
        for(w=1,i=0;i<N;++i,w*=2){//获取每个人戴的帽子(0为红帽子,1为白帽子)
            hat[i]=((bin&w)!=0); //按位与来检测其帽子颜色
        }
        for(w=0,i=0;i<N;++i)w+=hat[i];//统计总的白帽子数
        //检验甲的说法
        if(hat[0]){//如果甲戴白帽子,说真话
            if(w-1!=1)continue;//但是除了甲外,白帽子数不是1,说明解错误,换下一组解
        }else{//甲戴红帽子,说假话
            if(w==1)continue;
        }
        //检验乙的说法
        if(hat[1]){
            if(w-1!=N-1)continue;
        }else{
            if(w==N-1)continue;
        }
        //检验丙的说法
        if(hat[2]){
            if(!(w-1==1&&hat[0]==0))continue;
        }else{
            if(w==1&&hat[0]==0)continue;
        }
        //检验丁的说法
        if(hat[3]){
            if(!(w-1==0))continue;
        }else{
            if(w==0)continue;
        }
        //检验戊的说法
        if(hat[4]){
            if(!(w-1==1&&hat[0]==0))continue;
        }//如果戊说了假话,其余情况都有可能
        for(i=0;i<N;++i){
            printf("%d ",hat[i]);
        }
        printf("\n");
    }
    printf("\nFinished!\n");
    getch();
    return 0;
}

最后运行的结果显示为:0 0 1 0 1,即甲红、乙红、丙白、丁红、戊白。

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网