猜数字
Posted iversonx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猜数字相关的知识,希望对你有一定的参考价值。
题目描述:
游戏的规则如下:计算机随机产生一个4位数,然后玩家猜这个4位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确位置上。
输入数据有多组。每组的第一行为一个正整数N(1≤N≤100),表示在这段对话中共有N次回答。在接下来的N行中,每行三个整数A、B、C。gameboy猜这个4位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。当N=0时,则输入数据结束。
如果根据这段对话能确定该4位数,在输出该4位数;若不能确定,则输出“Not sure”。
输入样例:
6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3
0
输出样例:
3585
Not sure
题目解析:
这道题目可以从正面入手,4位数总共不到$10^4$,而数据也只有100组,所以可以采用枚举法,对每个4位数进行N次判断,如果这个数全部符合,则它有可能是计算机所产生的那个数,如果有多个这样的数,显然不能确定。
参考代码:
#include "stdio.h"
int n,a[101],b[101],c[101];
int ans,num;
_Bool check(int x,int y)
{
//4位数x是否符合第y次问答的结果
int s[4],t[4],pa=a[y],pb=b[y],pc=c[y];
for(int i =3;i >= 0;i--)
s[i] = x%10,x/=10,t[i] = pa%10,pa/=10;
//检查猜对的数字个数和在正确位置上的个数是否符合
int correct_num = 0,correct_pos = 0;
for (int i = 0; i < 4; ++i)
if(s[i] == t[i])
correct_pos++;//在正确位置上的个数
for(int i = 0;i < 4; i++)
for(int j = 0;j < 4;j++)
if(t[j] == s[i])
{
correct_num++;//猜对的数字个数
t[j] = -1;//防止同一个数字被重复使用
break;
}
return correct_num == pb && correct_pos == pc;
}
int main(int argc, char const *argv[])
{
while(scanf("%d",&n) && n)//该组有n次回答
{
for (int i = 0; i < n; ++i)
scanf("%d %d %d",&a[i],&b[i],&c[i]);
num = 0;//枚举范围内的每个值,判断是否符合条件
for(int i = 1000;i < 10000 && num < 2;i++)
{
int j = 0;
for(;j < n;j++)
if(!check(i,j))
break;
if(j == n)
num++,ans = i;
}
if(num == 1)
printf("%d
", ans);//题目要求有且只有一组符合
else
printf("Not sure
");
}
return 0;
}
以上是关于猜数字的主要内容,如果未能解决你的问题,请参考以下文章