跳水比赛,根据选手所提供信息,编程确定名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

先来分析这五位选手的话,因为每位选手都只说对了一半,所以有以下几种可能情况:(注意:以下文章中的“=”等号都是两个)
针对a选手所说: (b=2&&a!=3) || ( b!=2&&a=3)
针对b选手所说: (b=2&&e!=4) || ( b!=2&&e=4)
针对c选手所说: (c=1&&d!=2) || ( c!=1&&d=2)
针对d选手所说: (c=5&&d!=3) || ( c!=5&&d=3)
针对e选手所说: (e=4&&a!=1) || ( e!=4&&a=1)
有了以上判断,我们就可以通过一个循环来不断地查找出符合该判断的名次
#include<stdio.h>
#include<stdlib.h>
int main(){
int a=1;
int b=1;
int c=1;
int d=1;
int e=1;
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((((b=2)&&(a!=3))||((b!=2)&&(a=3)))
&&(((b=2)&&(e!=4))||((b!=2)&&(e=4)))
&&(((c=1)&&(d!=2))||((c!=1)&&(d=2)))
&&(((c=5)&&(d!=3))||((c!=5)&&(d=3)))
&&(((e=4)&&(a!=1))||((e!=4)&&(a=1)))
){
if(a
bcde==120){
printf(“a=%d,b=%d,c=%d,d=%d,e=%d”,a,b,c,d,e);
}
}
/
//上面的代码虽然是正确的,但是显然看起来很复杂且不好写,我们可以来想想是否存在一个简单的方法
//比如说,就 (b=2&&a!=3) || ( b!=2&&a=3)来说,b=2与a=3中,肯定有一个是成立的,我们根据逻辑值来进行判断,有一个为真,其逻辑值为1,那么用(b=2)+(a=3)=1来判断,岂不是更能减少代码量
if( ((b=2)+(a=3)=1)
&&((b=2)+(e=4)=1)
&&((c=1)+(d=2)=1)
&&((c=5)+(d=3)=1)
&&((e=4)+(a=1)=1)
){
//仅满足了上列条件,就能保证求出来的结果是唯一值吗,显然通过测试是不能的,因为它没有保证a,b,c,d,e这五者的值一定要不相同,比赛的名次肯定不能重复啊,所以还要再来一次判断以确保这五者的名次不相同,因为一共5个人,5个名次,5,4,3,2,1,根据数学的一个常数的因式分解是固定的,所以会想到abcde=120这个判断条件。
if(abcde==120){
printf(“a=%d,b=%d,c=%d,d=%d,e=%d”,a,b,c,d,e);
}
}
}
}
}
}
}
system(“pause”);
return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值