程设1. 猜数字看人品

ps:国庆闲来无事,回忆小学期程设编程题。当时痛苦不堪,如今有时间就想复盘一下,第一是防止自己以后忘记,第二是想帮助之后的学弟,在这个小学期过的不那么痛苦qwq。这个是”感受算法魅力“第一部分的第一题
 


描述:

Tom 和 Jerry 做猜数字的游戏,Tom 想一个数字然后让 Jerry 去猜,数字的范围在 1 到 10 之间。对于 Jerry 每讲的一个数,Tom 都要讲这个数是 too high 或者 too low 或者 right on,直到 right on 结束。为了防止 Tom 作弊,Jerry 把每一次的对话记录下来,现在让你去判断 Tom 有没有作弊。

输入:

游戏可能做很多次,直到 Jerry 猜 0 的时候游戏结束,每一次猜测由一个正整数和一行回答组成。

输出:

对每一次游戏如果 Tom 的回答有自相矛盾的地方,就输出 Tom is dishonest,否则输出 Tom may be honest。


问题分析:
首先我们只需要考虑一轮的输入情况即可。

在一轮中:我们会得到Tom的三种回答:too low/too high/right on。对应三种情况:min/max/right。但是我们知道Jerry可能大愚若智,可能Tom说完too low之后,他还会说出一个比上一次还低的数,所以我们要怎么样去判断Tom说的对不对呢。

就像上面我们说的那样,我们会自动的认为,Tom说完too low之后,他还会说出一个比上一次还低的数,是一种极其无用的行为,所以我们可以记录当前确定的最小值(too low)的最大值,只有当新的too low大于这个最小值的最大值的时候,才能会刷新这个最小值。同理,too high也是这样。

并且当too low的值大于max或者是too high的值小于min的时候,就一定error。

总结如下:

min,max//min代表最小值,max代表最大值

如果too low:
if(m>min)
min=m;

如果too high
if(m<=min)
error;

这样的话,我们只剩下right on的情况没有解决。其实同理,当right on的值不在(min,max)之间的话,就error。


坑点:

(ps:在给出最终代码之前,我还是想给你一点坑点提示。我清楚你来csdn搜到这个文章是为了什么。但是这题并不难,没有思路,上面我已经给了思路。发现保密WA,就可以来看我这个坑点,来debug qwq。)

1.考虑边界情况,当1或者是10的时候正好right on时,我们如果把上下界初始化成1和10,就会出现:出现1和10必error,所以我们需要把上下界定位0和11,或者是更加极端的数。

2.每一次得到error或者是right on的时候,都要把上下界重新初始化(这边建议的是一个数字加一句分析的循环。


参考代码:

终于,终于,终于,我删掉了(bushi),我终于发出了参考代码。

(下面的代码由于是我当时自己写的,所以难免粗糙qwq,现在懒狗一枚,不想写捏)

#include<iostream>
#include<string>  
#include<stdlib.h>  
using namespace std;  
const string high="too high";  
const string low="too low";  
const string Right="right on";  
struct{  
    int max;  
    int min;  
}x;  
int main()  
{  
    int a;  
    string p;  
    x.max=11;  
    x.min=0;  
    bool temp=1;  
    while(1)  
    {  
        cin>>a;  
        if(a==0)  
        break;  
        getchar();  
        getline(cin,p);  
        if(p==high)  
        x.max=a;  
        else if(p==low)  
        x.min=a;  
        else if(p==Right)
        {  
            cout<<"Tom may be honest"<<endl;  
            temp=0;  
        }  
        while(temp)  
        {  
            cin>>a;  
            getchar();  
            getline(cin,p);  
            if(p==high)
			{
				if(x.max>a)
				x.max=a;
			} 
            else if(p==low)
			{
				if(x.min<a)
				x.min=a;
			}
            else if(p==Right)
            {  
            	if(x.max==x.min)
            	{
            		cout<<"Tom is dishonest"<<endl;
            		break;
				}
                if(a>x.min&&a<x.max)  
                cout<<"Tom may be honest"<<endl;  
                else  
                cout<<"Tom is dishonest"<<endl;
                temp=0;  
            }  
        }  
        temp=1;  
        x.max=11;  
        x.min=0;  
        /*
        x.max=10;//这种情况会有问题(已解决)  就是在取边界1或者10为right on的时候会出现问题 
        x.min=1;
        */
    }  
}

我是一个right on一次循环,难免麻烦,都怪当时的自己qwq

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值