下面两道题通过枚举处理逻辑判断问题。有一定的相似性,因此写在一篇博文中。
2:四大湖
总时间限制:1000ms 内存限制:65536kB
描述
我国有4大淡水湖。
A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
已知这4个湖的大小均不相等,4个人每人仅答对一个,
请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。
输入
无。
输出
输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。
样例输入
(无)
样例输出
3
2
1
4
提示
样例输出仅供格式参考
代码
#include<iostream>
using namespace std;
int main()
{
int x,y,z,m;//分别记录鄱阳湖,洞庭湖,太湖,洪泽湖的排名
bool a,b,c,d;//分别表示四个人的判断,因为每个人只判断对一个,因此用布尔类型来记录判断对的那一个
for(x=1;x<=4;x++)
{
for(y=1;y<=4;y++)
{
if(x!=y)//题目要求四个湖的大小不同,因此排名都不一样
{
for(z=1;z<=4;z++)
{
if(z!=x&&z!=y)
{
m=10-x-y-z; //排名1+2+3+4=10
a=(x==3)+(y==1)+(z==2)+(m==4); //分别表示每个人的推断,但是,每个推断中只有一个是对的,四个人有四个是对的
b=(x==2)+(y==4)+(z==3)+(m==1);
c=(y==3)+(m==4);
d=(x==1)+(y==3)+(z==4)+(m==2);
if(a && b && c && d)
{
cout<<x<<endl;
cout<<y<<endl;
cout<<z<<endl;
cout<<m<<endl;
return 0;
}
}
}
}
}
}
return 0;
}
16:点评赛车
总时间限制:1000ms 内存限制:65536kB
描述
4名专家对4款赛车进行评论
1)A说:2号赛车是最好的;
2)B说:4号赛车是最好的;
3)C说:3号赛车不是最好的;
4)D说: B说错了。
事实上只有1款赛车最佳,且只有1名专家说对了,其他3人都说错了。
请编程输出最佳车的车号,以及说对的专家。
输入
无输入。
输出
输出两行。第一行输出最佳车的车号(1-4中的某个数字)。第二行输出说对的专家(A-D中的某个字母)。
样例输入
(无)
样例输出
1
A
提示
样例输出只是格式说明,并非正确答案
代码
#include<iostream>
using namespace std;
int main()
{
bool a,b,c,d;//记录四位专家的话
int best;//最佳车的车号
for(best=1;best<=4;best++)
{
a=(best==2);//如果最好的车是2号,那么a说的额是对的
b=(best==4);
c=!(best==3);
d=!b;
if(a+b+c+d==1)//只有一位专家说的是对的
{
cout<<best<<endl;
if(a==1)
cout<<"A";
else if(b==1)
cout<<"B";
else if(c==1)
cout<<"C";
else
cout<<"D";
return 0;
}
}
return 0;
}