3位老师对数学竞赛进行了预测。他们的预测如下:
甲说:学生 a 得第一名,学生 b 得第三名。
乙说:学生 c 得第一名,学生 d 得第四名。
丙说:学生 d 得第二名,学生 a 得第三名。
运行结果:
甲说:学生 a 得第一名,学生 b 得第三名。
乙说:学生 c 得第一名,学生 d 得第四名。
丙说:学生 d 得第二名,学生 a 得第三名。
竞赛结果表明,他们都说对了一半,说错了一半,并且无并列名次,编程求出a,b,c,d各自的名次。
分析:
信息数字化:我们令a,b,c,d 分别表示学生A,B,C,D 的名次,然后暴力枚举,同时判断
是否满足要求:他们都说对了一半,说错了一半。
对于甲老师的信息,可以数字化为:( a == 1 ) + ( b == 3 ) == 1.
对于表达式 :a == 1, 若 a 为 1 ,则此表达式的值为1,否则为0。于是,上面的式子就不难理解了。
代码:
#include <iostream>
using namespace std ;
int main()
{
int a , b , c , d ;
for( a = 1 ; a <= 4 ; a++ ) { //枚举 a
for( b = 1 ; b <= 4 ; b++ ) //枚举 b
if( a != b ) //要求 a != b
for( c = 1 ; c <= 4 ; c++ ) //枚举 c
if( c != a && c != b ) { // c != a 且 c != b
d = 10 - a - b - c ;
if( ( a == 1 ) + ( b == 3 ) == 1
&& ( c == 1 ) + ( d == 4 ) == 1
&& ( d == 2 ) + ( a == 3 ) == 1 )
cout << "a = " << a << ", "
<< "b = " << b << ", "
<< "c = " << c << ", "
<< "d = " << d << endl ;
}
}
return 0 ;
}
运行结果: