C语言 解决逻辑推理问题:我已经写出了代码,请帮我修正一下。谢谢

C语言 解决逻辑推理问题:我已经写出了代码,请帮我修正一下。谢谢,第1张

//罪犯不一定只有3个人,所以你的代码框架有点问题,直接帮你大换血了。

//不太好编辑,可能看起来有点乱

#include <stdio.h>

int main()

{

int A,B,C,D,E,F /猜碰/每个罪犯只有01两种情况,1是罪犯0清白

for(A=0A<2A++)//A

for(B=0B<2B++) //B

for(C=0C<2C++) //C

for(D=0D<2D++) //D

for(E=0E<2E++) //E

for(F=0F<2F++) //F

{

if( (A +B >0 ) //AB至少一人作案

&&(A+E+F >1) //AEF至少两人作案

&&(A+D == 1) //AD不可能是同案犯

&&(B+C != 1) //BC或穗拿谈同案 或与本案无关

&&(C+D == 1 ) //CD只有一人作案

&&(!(!D &&E))) //如果D没有参与作案,则E也不可能参与作案

{

printf("A:%s\n", A==1?"作案":"非作案" )

printf("B:%s\n", B==1?"作案":"非作案" )

printf("C:%s\n", C==1?"作案":"非作案" )

printf("D:%s\n", D==1?"作案":"非作案" )

printf("E:%s\n", E==1?"作案":"非作案" )

printf("F:%s\n", F==1?"敏亏作案":"非作案" )

break //如果不止一个解,就不需要这个break

}

}

return 0

}

main() {

short a,b,c,d,j,t

for (j = 0j <=15j++) { // 16次循环表示2的4次方袭唯

a = (j &8) >>3 // j和8按位与,然后右移三位

b = (j &4) >>2 //同上

c = (j &2) >>1//同上

d = j &1 //同上 不移位

t = (b + c + d == 1) + (!b &&c) + (a + d == 1) + (!b &&c)

//此处是四种表达式结果的和,其中 b+c+d==1 为例,即b+c+d如果等于1 那么这个表达式的值为1,否则为0,t即四个表达式的真值的和,用t的值来判断拆禅兄有几个是真的。

if ((t == 2) &&(a + b + c + d == 1)) {//如果其中两个条件为真,即t=2,并旅袭且abcd的和为1

printf ("%d,%d,%d,%d\n",a,b,c,d) //输出结果abcd

}

}

getch ()

}

貌似是和离散数学有关的,要先把命题符号化,然后进行推理,实际计算机执行的时候用真值表判断就可以了。。。

程序写的一般,没用什么美观界面之类的,这些你举枣都可以自己加,算法有很多,我用了一个比较简单易于理解的。程序得出的答案是ACDB你看看吧,有问题在问我。。。

#include<iostream>

#include<vector>

using namespace std

bool isSimilar(int a[4][4],const vector<char>&answer)//该函数为判断得出的答案是否与四人中的一人答案相似

{//即,如果其中一人的回答与得出的答案中两个以上答案相同,则不符合每人只答对了一个;函数返回1

int count=0

for(int i=0i<4i++)

{

count=0

for(int j=0j<4j++)

{

if(a[i][j]==(answer[j]-'A'+1))count++

}

if(count>=2)return 1

}

return 0

}

int main()

{

//answer[0],answer[1],answer[2],answer[3]分别代表正慧拆甲乙丙丁;

//answer[x][0],answer[x][1],answer[x][2],answer[x][3]代表他们的答案

//1代表洞庭湖,2代表鄱阳湖,3代表洪泽湖,4代表太湖,-1代表任意答案

int an[4][4]={{1,-1,2,3},{3,2,4,1},{-1,-1,1,2},{2,3,1,4}}

vector<char>answer

//A代表洞庭湖,B代表鄱阳湖,C代表洪泽湖,D代表太湖

answer.push_back('A')

answer.push_back('B')

answer.push_back('C')

answer.push_back('D')

//算法思想:得出答案的全排列,然后根据题意只有一个人回答正确 逐个判读得出的答案是否符合题意

do{

if(answer[0]=='D')continue//最大的湖根据题意只可能是A,B,c

if(answer[1]=='A'||answer[1]=='D')continue//第二大的湖根据题意只可能是B,c

if(answer[2]=='A'||answer[2]=='碧迅C')continue//第三大的湖根据题意只可能是B,D

if(!isSimilar(an,answer))//根据题意没人只答对了一个,如果有人答对了两个以上也不符合题意, 删去

{

for(int i=0i<4i++)

cout<<answer[i]

break

}

}while(next_permutation(answer.begin(),answer.end()))

system("pause")

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存