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