1.3 跳水选手名次问题

1.3 跳水选手名次问题

题目描述

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

分析

题目要求

编程确定比赛的名次

从题目要求可以确定本题重心应放在选手名次上,初步构想是枚举五人名次,逐一排查。

已知条件

  • 5位运动员参加比赛

    使用5个变量a,b,c,d,e分别记录五人名次。

  • 每个人说了两句话,一对一错。

    使用5个变量wordA,wordB,wordC,wordD,wordE分别记录每个人说对的个数。

变量转化

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

wordA = (b == 2) + (a == 3);

wordB = (b == 2) + (e == 4);

wordC = (c == 1) + (d == 2);

wordD = (c == 5) + (d == 3);

wordE = (e == 4) + (a == 1);

实现

代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // A,B,C,D,E五人名次,取值范围1,2,3,4,5
    int a,b,c,d,e;
    // 五人说对的个数,取值范围0,1,2
    int wordA,wordB,wordC,wordD,wordE;
    // 有无解标记,初始值0
    int flag = 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) {
                            continue;
                        }
                        /******************************************
                         * 更新变量值
                        *******************************************/
                        wordA = (b == 2) + (a == 3);
                        wordB = (b == 2) + (e == 4);
                        wordC = (c == 1) + (d == 2);
                        wordD = (c == 5) + (d == 3);
                        wordE = (e == 4) + (a == 1);
                        /*****************************************
                         * 核心条件
                         * 若每人说的话一对一错--》输出结果,并置有无解标记flag为1
                        ******************************************/
                        if (wordA == 1 && wordB == 1 && wordC == 1 && wordD == 1 && wordE == 1) {
                            printf(" A选手是第 %d 名\n",a);
                            printf(" B选手是第 %d 名\n",b);
                            printf(" C选手是第 %d 名\n",c);
                            printf(" D选手是第 %d 名\n",d);
                            printf(" E选手是第 %d 名\n",e);
                            flag = 1;
                        }
                     }
                }
            }
        }
    }
    /******************************
     * 有无解判断
     * 若无解,输出无解
     * ****************************/
    if (!flag) {
        printf("无解\n");
    }

    system("pause");
    return 0;
}

运行结果
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值