全排序算法解决逻辑问题的一个例子

题目:

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;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值