枚举题——四大明湖排序(本菜优化了一下)
上题:
A:洞庭最大,洪泽最小,鄱阳第三
B:洪泽最大,洞庭最小,鄱阳第二,太湖第三
C:洪泽最小,洞庭第三
D:鄱阳最大,太湖最小,洪泽第二,洞庭第三
分析:
(1)
用a,b,c,d分别表示四个湖的排序。A表示洞庭,b表示洪泽,c表示鄱阳,d表示太湖。
A学生的回答可表示为:a==1 && b==4 && c==3
B学生的回答可表示为:a==4 && b==1 && c==2 && d==3
C学生的回答可表示为:a==3 && b==4
D学生的回答可表示为: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 # include<stdio.h> 2 # include<iostream> 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 //todo 22 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 # include<iostream> 2 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 else 11 for (c=1; c<=4; ++c) 12 if (c==a||c==b) 13 continue; 14 else 15 { 16 d=10-a-b-c; 17 if (((a==1)+(b==4)+(c==3))==1 18 &&((b==1)+(a==4)+(c==2)+(d==3))==1 19 &&((b==4)+(a==3))==1 20 &&((c==1)+(d==4)+(b==2)+(a==3))==1) 21 cout << a << b << c << d; 22 } 23 }
方法三(再优化了一下)
1 # include<iostream> 2 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 else 15 { 16 d=10-a-b-c; 17 if (((a==1)+(b==4)+(c==3))==1 18 &&((b==1)+(a==4)+(c==2)+(d==3))==1 19 &&((b==4)+(a==3))==1 20 &&((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 # include<iostream> 2 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 else 15 { 16 d=10-a-b-c; 17 if (((a==1)+(b==4)+(c==3))==1 18 &&((b==1)+(a==4)+(c==2)+(d==3))==1 19 &&((b==4)+(a==3))==1 20 &&((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 }