枚举题——四大明湖排序(本菜优化了一下)

上题:

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 }
View Code

方法二(优化了一下)

 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 }
View Code

 

方法三(再优化了一下)

 

 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 }
View Code

 

 

 

方法四(再优化了一下)

 

 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 }
View Code

 

 

 

 

posted @ 2013-11-09 09:22  天天AC  阅读(391)  评论(0编辑  收藏  举报