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

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

这个问题我用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=0i<N++i)max*=2//计算max=2^N

    for(bin=0bin<max++bin){//用N位二进制数表示每个人的帽子状态,bin=00000~11111

        for(w=1,i=0i<N++i,w*=2){//获取每个人戴的帽子(0为红帽子,1为白帽子)

            桐埋hat[i]=((bin&w)!=0) //按位与来检测其帽子颜色

        }

        for(w=0,i=0i<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=0i<N++i){

            printf("%d ",hat[i])

        }

        printf("\n")

    }

    printf("\nFinished!\n")

  局敬蚂  getch()

    return 0

}

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

写个吧,帮人本不应要报酬,

第一题:

program aa

var

dong,hong,bo,tai:integer

begin

for dong:=1 to 4 do

for hong:=1 to 4 do

if dong<>hong then for bo:=1 to 4 do

if (dong<>bo) and (hong<>bo) then begin

tai:=10-dong-bo-hong

if (ord(dong=1)+ord(hong=4)+ord(bo=3)=1)and(ord

(hong=1)+ord(dong=4)+ord(bo=2)+ord(tai=3)=1)and(ord(hong=4)+ord

(dong=3)=1)and(ord(bo=1)+ord(tai=4)+ord(hong=2)+ord(dong=3)=1)

then

write('dong:',dong,' hong:',hong,' bo:',bo,' tai:',tai)

end

end.

结果是:dong:2 hong:4 bo:1 tai:3

第二题:

program aa

var

a,b,c,d,e,f:boolean

i:integer{此处是测试用}

begin

i:=0

for a:=false to true do

for b:=false to true do

for c:=false to true do

for d:=false to true do

for e:=false to true do

for f:=false to true do

begin

if{1}(a=false)and(b=false)or{2}(a=true)and(d=true)or{3}

(a=b)and(b=c)and(a=c)or(a=false)and(e=false)or(a=false)and(f=false)

or(e=false)and(f=false)or{4}(b<>c)or{5}(c=d)or{6}(d=false)and(e=true)then i:=i+1{把不符合的跳过去}

else begin

if a=true then write('a')

if b=true then write('b')

if c=true then write('c')

if d=true then write('d')

if e=true then write('e')

if f=true then write('f')

end

end

write(i)

end.

你的条件是不是不对啊,我算的无解,不知道怎么回事,不过这样应该是可以的,要不你再改改……

今天先写两个吧,下午再写第三个啦~~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12542065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存