质疑一个不怎么难的问题
以下是从书上节选的内容(OCR扫描上来的,可能会有点小错误):1.3个人比饭量大,每个人说了两句话。
A说:B比我吃得多,C和我吃得一样多。
B说:A比我吃得多,A也比C吃得多。
C说:我比B吃得多,B比A吃得多。
事实上饭量越小的人讲对的话越多。请编程按饭量的大小输出3
个人的顺序。
[算法分析]
首先,把每个人的饭量分别用整数1,2,3来表示,数字越大就表
示这个人的饭量越大,由于题目中A说的话中提到了有可能两个人的
饭量相同,也就是说代表3个人饭量的数字有可能相等。
用一个三重循环来枚举每个人的饭量,分别用A,B,C表示这3
个人的饭量。将这3个人说的话As,Bs,Cs写成表达式:
As=(B>A)+(C==A);
Bs=(A>B)+(A>C) ;
Cs=(C>B)+(B>A) ;
根据题意,饭量越小的人讲对的话越多,也就是说,不存在两个
人,其中一个人的饭量比另一个人小,且说对的话不比另一个人多。
当变量满足这个条件时,就可以输出这组解了。
[参考程序]
#include <iostream>
using namespace std;
int main()
{
int A, B, C; //定义3个人的饭量
int As, Bs, Cs; //定义3个人说的话
int AnsA, AnsB, AnsC; //用于记录最后的答案
for (A = 1; A <= 3; A++)
for (B = 1; B <= 3; B++)
for (C = 1; C <= 3; C++)
{
As = (B>A) + (C==A); //A讲的话
Bs = (A>B) + (A>C) ; //B讲的话
Cs = (C>B) + (B>A) ; //C讲的话
if(!(A <= B && As <= Bs || A <= C && As <= Cs ||
B <= A && Bs <= As || B <= C && Bs <= Cs ||
C <= A && Cs <= As || C <= B && Cs <= Bs))
//如果不存在一个人饭量比另一个人小,说对的话也不比另一个人多,则记录下这时的解
{
AnsA = A;
AnsB = B;
AnsC = C;
}
}
//输出部分省略
return 0;
}
我觉得加红的代码很奇怪,题目之前说过“代表3个人饭量的数字有可能相等”,那么类似 A == B && As == Bs 的情况是有可能出现的,而这种情况恰是 A <= B && As <= Bs 的一个子集,这是相矛盾的。我觉得按照“如果不存在一个人饭量比另一个人小,说对的话也不比另一个人多,则记录下这时的解”这个条件,加红的部分,"="号应该全部去掉。
请大家帮忙看看,谢谢!