| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2606 人关注过本帖
标题:跳水名将问题,
只看楼主 加入收藏
鲲小鹏
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-1-11
结帖率:0
收藏
 问题点数:0 回复次数:7 
跳水名将问题,
题目(Description):
5位跳水高手参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果。
         A选手说:B第二,我第三;
         B选手说:我第二,E第四;
         C选手说:我第一,D第二;
         D选手说:C最后,我第三;
         E选手说:我第四,A第一.
决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错。请编程解出比赛的实际名次。
输入:无
输出:“A是第x名”
搜索更多相关主题的帖子: 输入 输出 编程 预测 比赛 
2021-01-12 16:32
Tsing_winter
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2021-1-12
收藏
得分:0 
//5位跳水高手将参加10M高台跳水的决赛,有好事者让5人据实力预测比赛结果。
//A选手说:B第二,我第三。a=(B==2)+(A==3)
//B选手说:我第二,E第四。b=(B==2)+(E==4)
//C选手说:我第一,D第二。c=(C==1)+(D==2)
//D选手说:C最后,我第三。d=(C==5)+(D==3)
//E选手说:我第四,A第一。e=(E==4)+(A==1)
//决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错。请编程解出比赛的实际名次。
#include<iostream.h>
int main()
{
    int A,B,C,D,E;   
    int a,b,c,d,e;
    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++)
                {
                    a=(B==2)+(A==3);
                    b=(B==2)+(E==4);
                    c=(C==1)+(D==2);
                    d=(C==5)+(D==3);
                    e=(E==4)+(A==1);
                    if((a*b*c*d*e==1)&&(A+B+C+D+E==15)&&(A*B*C*D*E==120))
                        cout<<"A是第"<<A<<"名"<<endl;
                }
                return 0;
}
2021-01-12 16:39
请输入密码
Rank: 2
等 级:论坛游民
威 望:5
帖 子:35
专家分:84
注 册:2020-11-19
收藏
得分:0 
看过二楼的思路,确定可以。但还有一种方法就是先设定ABCDE的真假,这才只有32种情况,也比较符合正常人的四维模式。

但发现写起来判定矛盾有点意思,莫太多时间弄出来,先咕了,放下放下。

[此贴子已经被作者于2021-1-14 10:51编辑过]


Bug易改,码风难移。
有事离开,无事灌水。
2021-01-14 10:48
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
回复 3楼 请输入密码
这种情况我试了一下,没有成功。结果不唯一。下述核心判断逻辑与三楼思想类同。
#include <stdio.h>
int main()
{
    int A,B,C,D,E;
    int a,b,c,d,e,a1,b1,c1,d1,e1;
    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++)
                    {
                        a=(B==2)+(A==3);
                        b=(B==2)+(E==4);
                        c=(C==1)+(D==2);
                        d=(C==5)+(D==3);
                        e=(E==4)+(A==1);
                        a1=(B==2)&&(A==3);
                        b1=(B==2)&&(E==4);
                        c1=(C==1)&&(D==2);
                        d1=(C==5)&&(D==3);
                        e1=(E==4)&&(A==1);
                        if((a*b*c*d*e) && !(a1+b1+c1+d1+e1))

                            printf("%d %d %d %d %d",A,B,C,D,E);

                        //if((a*b*c*d*e==1)&&(A+B+C+D+E==15)&&(A*B*C*D*E==120))
                        //    printf("?");
                    }
    return 0;
}


[此贴子已经被作者于2021-1-14 13:09编辑过]

2021-01-14 13:03
请输入密码
Rank: 2
等 级:论坛游民
威 望:5
帖 子:35
专家分:84
注 册:2020-11-19
收藏
得分:0 
回复 4楼 zbjzbj
我大体看看不出具体问题在哪,但一运行看结果就知道了。排名重复没处理好,当然如果处理好,再对比,本质也是和二楼代码差不多。说实在的,这思路我是打算用二进制来控制条件真假的。但实现起来非常麻烦,远没有二楼直接代值简洁,由于工作原因,不能像以前那样一个代码能花一天时间设计调试了,不得不放鸽子去,只能简单说说思路。

Bug易改,码风难移。
有事离开,无事灌水。
2021-01-14 14:20
wfgzb
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2021-1-11
收藏
得分:0 
回复 2楼 Tsing_winter
可以说一下这什么意思吗?初学者不懂
if((a*b*c*d*e==1)&&(A+B+C+D+E==15)&&(A*B*C*D*E==120))
                        cout<<"A是第"<<A<<"名"<<endl;
2021-01-15 21:16
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
回复 6楼 wfgzb
头一个括号是五个数相乘等于1,那就是每个数都是一。结合前文知道它是为了每个人说的话有一个对的。
五个数相加等于15和五个数相乘等于120是为了吻合这五个数是1,2,3,4,5而且不重复
2021-01-15 21:57
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void)
{
    enum { A = 0, B, C, D, E };
    int result = 0;     //A的真实名次
    bool isok = true;   //已知条件能否锁定A的名次
    int really[5];      //真实名次
    int guess[5][2][2] = { {{B, 2},{A, 3}}, {{B, 2},{E, 4}}, {{C, 1},{D, 2}}, {{C, 5},{D, 3}}, {{E,4},{A,1}} };  //[guesser][guessed][results]

    for (size_t _case = 1; _case <= 32; _case++)        //2^5种组合
    {
        bool self_consistency = true;     //本组猜测是否自洽
        int num = 5;    //本组合猜测涉及人数

        for (size_t contestant = A; contestant <= E; contestant++)       //实际排名置空
            really[contestant] = 0;

        for (size_t guesser = A; guesser <= E && self_consistency; guesser++)       //将每个人猜测的其中一个赋给真实排名
            if (!really[guess[guesser][_case >> guesser & 1][0]])        //排名为0,说明没有被猜过
            {
                for (size_t guessed = A; guessed <= E && self_consistency; guessed++)
                    self_consistency = really[guessed] != guess[guesser][_case >> guesser & 1][1];     //如果该名次已被其他人占用,不自洽
                really[guess[guesser][_case >> guesser & 1][0]] = guess[guesser][_case >> guesser & 1][1];
            }
            else if (really[guess[guesser][_case >> guesser & 1][0]] != guess[guesser][_case >> guesser & 1][1])  //两个人猜一个人名次不一致,不自洽
                self_consistency = false;
            else
                num--;

        if (num == 4)
            for (size_t contestant_1 = A; contestant_1 <= E; contestant_1++)   //补齐排名
            {
                if (really[contestant_1])
                    continue;
                really[contestant_1] = 15;
                for (size_t contestant_2 = A; contestant_2 <= E; contestant_2++)
                    if (contestant_1 != contestant_2)
                        really[contestant_1] -= really[contestant_2];
            }
        else if (num < 4)
            continue;

        for (size_t contestant = A; contestant <= E; contestant++)     //判断每个人是否都只猜中一半
            if (really[guess[contestant][0][0]] == guess[contestant][0][1] && really[guess[contestant][1][0]] == guess[contestant][1][1])
            {
                self_consistency = false;
                break;
            }

        if (!self_consistency)     //不自洽,退出本次循环
            continue;

        if (result && (really[A] != result))
        {
            printf("%d %d\n", result, really[A]);
            isok = false;
            break;
        }
        else
            result = really[A];        
    }

    if (isok && result)
        printf("A是第%d名\n", result);
    else
        printf("已知条件无法确定A的名次\n");

    return 0;
}


[此贴子已经被作者于2021-1-29 17:13编辑过]

收到的鲜花
2021-01-18 00:22
快速回复:跳水名将问题,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045706 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved