C/C++ 算法分析与设计:枚举(谁获冠军?)

题目描述

ABCDE五个人在运动会上分获百米(1)、二百米(2)、跳高(3)、跳远(4)和铅球冠军(5)中的一项,有四个人猜测比赛结果: 
甲说:B获铅球冠军,D获跳高冠军。 
乙说:A获百米冠军,E获跳远冠军。 
丙说:C获跳远冠军,D获二百米冠军。 
丁说:B获跳高冠军,E获铅球冠军。 
其中每个人说了2句,现知道每个人说对了几句。问5人各获得哪项冠军?

输入

多组测试数据,每组测试数据包含5行 
第1行4个数字,分别表示4个人说对的句数(0,1或2) 
然后4行分别是各人的2个猜测,每行4个数字,先是运动员 然后是项目,A为1,B为2,C为3,D为4,E为5 

输出

在一行分别输出5人拿冠军的项目,如果不能确定则输出"Sorry"

样例输入

1 1 1 1
2 5 4 3
1 1 5 4
3 4 4 2
2 3 5 5
1 0 1 2
2 5 4 3
1 1 5 4
3 4 4 2
2 3 5 5

样例输出

1 2 4 3 5
Sorry
#include
using namespace std;
int main()
{
 int A,B,C,D,E;
 int a[4],f=0,i,j,b[4][4];
 while(cin>>a[0]>>a[1]>>a[2]>>a[3])
 {
	 for(i=0;i<4;i++)
		 for(j=0;j<4;j++)
			 cin>>b[i][j];
 f=0;
 for(A=1;A<=5;A++)
  for(B=1;B<=5;B++)
   for(C=1;C<=5;C++)
    for(D=1;D<=5;D++)
     for(E=1;E<=5;E++)
     {
      if( (A!=B) && (A != C) && (A!=D) &&(A!=E) &&(B!=C)&&(B!=D)&&(B!=E)&&(C!=D)&&(C!=E)&&(D!=E))
      if ( (((B==5)+(D==3))==a[0])  &&  (((A==1)+(E==4))==a[1])  &&  (((C==4)+(D==2))==a[2])  &&  (((B==3)+(E==5))==a[3]))
      {
       printf("%d %d %d %d %d\n",A,B,C,D,E);f=1;
      }

     }
	 if(f==0)
		 printf("Sorry\n");
 }
} 

 

你可能感兴趣的:(rwoj-AC)