题目:
5位选手参加比赛,有好事者让5人据实力预测比赛结果。
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一。
比赛成绩公布后,每位选手的预测都只说对了一半。请编程解出比赛的实际名次。
源程序:
#include<stdio.h>
#define n 5
int a[n+3],b[n+1];
int judge();
main()
{
/*Init*/
int max=n,arrow=-1,i,mobile=1;
a[0]=a[n+1]=100000000;a[n+2]=-100000000;
for(i=1;i<=n;i++){a[i]=i;b[i]=-1;}
/*Start*/
while(mobile)
{
/*Found a permutation*/
/*for(i=1;i<=n;i++)printf("%d ",a[i]);
printf("/n"); */
judge();
/*Find the largest mobile integer max*/
mobile=0;
max=n+2;
for(i=1;i<=n;i++)
if(a[i]>a[max]&&a[i+b[i]]<a[i])
{
max=i;
mobile=1;
arrow=b[max];
}
/*Switch max and the adjacent integer its arrow points to*/
i=a[max+arrow];
a[max+arrow]=a[max];
a[max]=i;
i=b[max+arrow];
b[max+arrow]=b[max];
b[max]=i;
max=max+arrow;
/*Switch the direction of all integer i with i>max*/
for(i=1;i<=n;i++)if(a[i]>a[max])b[i]*=-1;
}
//exit(0);
}
int judge()
{
int cc1,cc2,cc3,cc4,cc5;
cc1=(a[2]==2)+(a[1]==3); //A选手说:B第二,我第三
cc2=(a[2]==2)+(a[5]==4); //B选手说:我第二,E第四
cc3=(a[3]==1)+(a[4]==2); //C选手说:我第一,D第二
cc4=(a[3]==5)+(a[4]==3); //D选手说:C最后,我第三
cc5=(a[5]==4)+(a[1]==1); //E选手说:我第四,A第一
//每位选手的预测都只说对了一半
if(cc1+cc2+cc3+cc4+cc5==5 && cc1*cc2*cc3*cc4*cc5==1)
{
printf("A:%d,B:%d,C:%d,D:%d,E:%d/n",a[1],a[2],a[3],a[4],a[5]);
return 1;
}
else
return 0;
}