//不太好编辑,可能看起来有点乱
#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")
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)