@xudongh
2016-10-23T11:45:33.000000Z
字数 1210
阅读 3353
计算机
题目:
注意: 总时间限制: 1000ms 内存限制: 65536kB
我国有4大淡水湖。
A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
已知这4个湖的大小均不相等,4个人每人仅答对一个,
请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给的他们的大小排名。输入
无。输出
输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。样例输入
无
样例输出
(样例输出仅供格式参考,此题只有一个解, 。)
题目图片如下:
答案
#include <stdio.h>
int main(){
int d, h, p, t; //遍历所有可能的四大湖排名情况
for(d=1; d<=4; d++) {
for(h=1; h<=4; h++) {
for(p=1; p<=4; p++) {
for(t=1; t<=4; t++) {
if((d!=h&&d!=p&&d!=t&&h!=p&&h!=t&&p!=t) //保证每个湖的排名大小不同
&&((d==1)+(h==4)+(p==3)==1)
&&((h==1)+(d==4)+(p==2)+(t==3)==1)
&&((h==4)+(d==3)==1)
&&((p==1)+(t==4)+(h==2)+(d==3)==1)
&&((d+h+p+t)==10)) {
printf("%d\n%d\n%d\n%d\n", d, h, p, t);
return 0;
}
}
}
}
}
return 0;
}
分析
对于这道题,其实可以通过笔算慢慢分析即可得出答案,但如何使用编程语言来表示,这是个问题。
答案中,d、h、p、t分别代表洞庭湖、洪泽湖、鄱阳湖和太湖。其编程思想是,通过四个嵌套的for循环,先列出d、h、p、t所有的排列组合,然后再使用最内层的if语句检查是否满足题意。
d!=h&&d!=p&&d!=t&&h!=p&&h!=t&&p!=t
表达式保证了四个湖的排名不相等;
而对于if语句中的
((d==3)+(h==4)+(p==3)==1)
&&((h==1)+(d==4)+(p==2)+(t==3)==1)
&&((h==4)+(d==3)==1)
&&((p==1)+(t==4)+(h==2)+(d==3)==1)
&&((d+h+p+t)==10))
这是通过题意A、B、C、D四人的话中符合“4个人每人仅答对一个”这一情况的组合。通过==运算符判定,若相等,则值为1,否则为0;四项相加为1,说明“每人仅答对一个”。
输出结果为:
2
4
1
3
这道题的解题思路有几点是值得学习的:
1. 先使用四个for循环,结合d、p、h、t四个变量不可能相等的情况,列出它们可能出现的全部排列;
2. 将A、B、C、D四人的话,通过==运算符转化为编程语言;再使用并集,表示“同时满足条件”。