上题:
A:洞庭最大,洪泽最小,鄱阳第三B:洪泽最大,洞庭最小,鄱阳第二,太湖第三C:洪泽最小,洞庭第三D:鄱阳最大,太湖最小,洪泽第二,洞庭第三
分析:
(1)
用a,b,c,d分别表示四个湖的排序。A表示洞庭,b表示洪泽,c表示鄱阳,d表示太湖。A学生的回答可表示为:a==1 && b==4 && c==3B学生的回答可表示为:a==4 && b==1 && c==2 && d==3C学生的回答可表示为:a==3 && b==4D学生的回答可表示为:a==3 && b==2 && c==1 && d==4(2)
由于每位学生都只说对了一个,因此每位同学的若干个关系表达式中只有一个为真,其余都为假。因此,对A同学:((a==1) + ( b==4) + ( c==3)) == 1对B同学:((a==4) + ( b==1) + ( c==2) + ( d==3)) == 1对C同学:((a==3) + ( b==4)) == 1对D同学:((a==3) + ( b==2) + ( c==1) + (d==4)) == 1本题的答案就是找同时满足上面四个条件的答案
------------------------------------------------------------------------------------------------
方法一(传统的枚举方法)
1 # include2 # include 3 int main() 4 { 5 int dongting; 6 int hongze; 7 int boyang; 8 int tai; 9 int A;10 int B;11 int C;12 int D;13 for(dongting=1; dongting<5; dongting++)14 {15 for(hongze=1; hongze<5; hongze++)16 {17 for(boyang=1; boyang<5; boyang++)18 {19 for(tai=1; tai<5; tai++)20 {21 //todo22 A= ( (dongting==4) + (hongze==1) + (boyang==3) );23 B= ( (hongze==4) + (dongting==1) + (boyang==2) + (tai==3));24 C= ( (hongze==1) + (dongting==3));25 D= ( (boyang==4) + (tai==1) + (hongze==2) + (dongting==3));26 if( (A==1) && (B==1) && (C==1) && (D==1) )27 {28 if(dongting!=tai&&dongting!=hongze&&dongting!=boyang&&tai!=hongze&&tai!=boyang&&hongze!=boyang)29 {30 printf("dongting=%d\n",dongting);31 printf("hongze=%d\n",hongze);32 printf("tai=%d\n",tai);33 printf("boyang=%d\n",boyang);34 }35 }36 }37 }38 }39 }40 41 return 0;42 }
方法二(优化了一下)
1 # include2 using namespace std; 3 int main() 4 { 5 int a, b, c, d; 6 for (a=1; a<=4; ++a) 7 for (b=1; b<=4; ++b) 8 if ( a == b) 9 continue;10 else11 for (c=1; c<=4; ++c)12 if (c==a||c==b)13 continue;14 else15 {16 d=10-a-b-c;17 if (((a==1)+(b==4)+(c==3))==118 &&((b==1)+(a==4)+(c==2)+(d==3))==119 &&((b==4)+(a==3))==120 &&((c==1)+(d==4)+(b==2)+(a==3))==1)21 cout << a << b << c << d;22 }23 }
方法三(再优化了一下)
1 # include2 using namespace std; 3 int main() 4 { 5 int a, b, c, d; 6 bool flag = false; 7 for (a=1; a<=4; ++a) 8 { 9 for (b=1; b<=4; ++b)10 {11 if ( a == b) continue;12 else for (c=1; c<=4; ++c)13 if (c==a||c==b) continue;14 else15 {16 d=10-a-b-c;17 if (((a==1)+(b==4)+(c==3))==118 &&((b==1)+(a==4)+(c==2)+(d==3))==119 &&((b==4)+(a==3))==120 &&((c==1)+(d==4)+(b==2)+(a==3))==1)21 {22 cout << a << b << c << d;23 flag = true;24 break;25 }26 }27 if (flag) break;28 }29 if (flag) break;30 }31 }
方法四(再优化了一下)
1 # include2 using namespace std; 3 int main() 4 { 5 int a, b, c, d; 6 bool flag = false; 7 for (a=1; a<=4 && !flag; ++a) 8 { 9 for (b=1; b<=4 && !flag; ++b)10 {11 if ( a == b) continue;12 else for (c=1; c<=4 ; ++c)13 if (c==a||c==b) continue;14 else15 {16 d=10-a-b-c;17 if (((a==1)+(b==4)+(c==3))==118 &&((b==1)+(a==4)+(c==2)+(d==3))==119 &&((b==4)+(a==3))==120 &&((c==1)+(d==4)+(b==2)+(a==3))==1)21 {22 cout << a << b << c << d;23 flag = true;24 break;25 }26 }27 }28 }29 }