211
社区成员




某班中的一位同学做了好事不留名,表扬信来了之后,班主任问A,B,C,D,E,F 六位同学是谁做的好事,六位的回答如下:
A说:不是我。
B说:是C。
C说:是D。
D说:C胡说。
E说:不是C就是E
F说:即不是D也不是E
如果N个人说的是真话,则根据这些信息,找出可能做了好事的人。
输入N,N个人可能说的是真话
有可能做好事的同学(A-F),如果有多位同学有可能做好事,则同学名称按字典序全部输出。同学名之间用" or "间隔。
如果无法找出,输出"Error"。
2
在这里给出相应的输出。例如:
A or D
这一题刚刚做是比较有意思的,要我们自己算都要一个个尝试,但计算机最喜欢这样的事。
这一题和前面的循环练习不一样,这题只有1个输入,输出,所以任何判断是关键。先我们自己想,我们做这个要从A是否对,B是否对等等,一个个算。然后我们可以先假设只有一个同学说真话,那么我们从A到F单一进行判断,假如A说真话,到计算机我们可以让结果为A=1,其他为0,来实现判断A说的是真话。以此类推有多个人说真话我们也可以这样来解决。结果我们现在知道了,开始推过程。我们如何让A=1,B=1等等依次进行?之前学的嵌套循环就开始用了,只要我们让A,B等等始终在0和1之间就可以解决了。
for(f=0;f<=1;f++){
for(e=-0;e<=1;e++){
for(d=0;d<=1;d++){
for(c=0;c<=1;c++){
for(b=0;b<=1;b++){
for(a=0;a<=1;a++){
这段代码可以让他们始终在0和1之间。接着是如何判断了。首先我们有N个人说真话,我们刚刚开始让说真话的为1,所以我们可以让A+B+C+D+E+F=N就可以实现(当然这只是我的方法)接着判断他们有几个是真话也可以用类似的方法,用我们之前学的&&和||实现
a+b+c+d+e+f==1&&(a==0)+(c==1)+(d==1)+(d==0)+(c==1||e==1)+(d==0&&e==0)==N
这段代码就是判断是否该次循环是否成立,然后就输出。
#include<stdio.h>
int main(){
int N;
scanf("%d",&N);
int a,b,c,d,e,f;
int t=0;
for(f=0;f<=1;f++){
for(e=-0;e<=1;e++){
for(d=0;d<=1;d++){
for(c=0;c<=1;c++){
for(b=0;b<=1;b++){
for(a=0;a<=1;a++){
if(a+b+c+d+e+f==1&&(a==0)+(c==1)+(d==1)+(d==0)+(c==1||e==1)+(d==0&&e==0)==N){
if(t==1)printf(" or "); //判断是否输出"or"
if (a==1)printf("A");
if (b==1)printf("B");
if (c==1)printf("C");
if (d==1)printf("D");
if (e==1)printf("E");
if (f==1)printf("F");
t=1; //t在第一次输出后要赋值,不然"or"无法输出
}
}
}
}
}
}
}
if(t==0){printf("Error");
}
return 0;
}
输入:2
输出:A or D
输入:3
输出:B or E or F
运用了穷举算法,还可以分析一下其特点、不足和改进。