/*======================================================================
比饭量
总时间限制: 1000ms 内存限制: 65536kB
描述
3个人比饭量,每人说了两句话:
A说:B比我吃的多,C和我吃的一样多
B说:A比我吃的多,A也比C吃的多
C说:我比B吃得多,B比A吃的多。
事实上,饭量和正确断言的个数是反序的关系。
请编程按饭量的大小输出3个人的顺序。
输入
无输入
输出
按照饭量大小输出3人顺序,比如:
ABC
样例输入
无
样例输出
无
解析:这个题目在OpenJudge提交时,题目意思不清晰,应该按饭量从小到大的顺序输出字母
用三重for循环枚举所有可能的解
对每一种可能的解计算每一个人正确断言的数量
然后把饭量、正确断言数量分别打包到数组(把人对应的编号一起封装)
对两个数组进行排序(一个由大到小,另一个由小到大)
检测两个数组每一个元素对应的人名字是否一致,若所有人的名字一致,得到一个可行解。输出
继续循环寻找下一个可行解
========================================================================*/
1 #include<iostream>
2 using namespace std;
3 struct person
4 {
5 int n;//饭量或者断言数量
6 char name;//名字
7 };
8 int main()
9 {
10 int a,b,c;//三者的范围都是1~3,这里把a、b、c的值看作他们的饭量(不一定要用1~3,只要能区分出三个数的大小就行了)
11 //当然,也可以换一下思路,用a、b、c表示饭量排名
12 int A,B,C;//表示断言正确的数量
13 struct person x[3],y[3],t;
14 int i,j,flag;
15 for(a=0;a<3;a++)
16 {
17 for(b=0;b<3;b++)
18 {
19 for(c=0;c<3;c++)
20 {
21 A=(b>a)+(c==a);
22 B=(a>b)+(a>c);
23 C=(c>b)+(b>a);
24 /*假如三个人的饭量不会相等、三个人的断言正确数量也不会相等,
25 下面就判断a+A、b+B、c+C是否都相等,都等于3就行了。
26 但是这个题目,三个人饭量可能相等,断言正确数量也可能一样,必需用其他方式*/
27 //下面把a、b、c、A、B、C分别放到数组x、y当中。 然后对x、y数组进行排序
28 x[0].n=a;x[0].name='A';
29 x[1].n=b;x[1].name='B';
30 x[2].n=c;x[2].name='C';
31 y[0].n=A;y[0].name='A';
32 y[1].n=B;y[1].name='B';
33 y[2].n=C;y[2].name='C';
34 //对x数组按元素的饭量从大到小排序,对y数组按元素的断言正确数量从小到大排序
35 for(i=1;i<3;i++)
36 {
37 flag=1;
38 for(j=0;j<3-i;j++)
39 {
40 if(x[j].n<x[j+1].n)
41 {
42 flag=0;
43 t=x[j];
44 x[j]=x[j+1];
45 x[j+1]=t;
46 }
47 }
48 if(flag) break; //if(flag==1) break;
49 }
50
51 for(i=1;i<3;i++)
52 {
53 flag=1;
54 for(j=0;j<3-i;j++)
55 {
56 if(y[j].n>y[j+1].n)
57 {
58 flag=0;
59 t=y[j];
60 y[j]=y[j+1];
61 y[j+1]=t;
62 }
63 }
64 if(flag) break; //if(flag==1) break;
65 }
66 //从头到尾检查x和y数组每一个元素对应的是否是同一个人
67 for(i=0;i<3;i++)
68 {
69 if(x[i].name!=y[i].name) break;
70 }
71 if(i==3)
72 {//输出结果
73 for(i=2;i>=0;i--)
74 cout<<x[i].name;
75 cout<<endl;
76 }
77 }
78 }
79 }
80 return 0;
81 }