猜数字

题目描述:
  游戏的规则如下:计算机随机产生一个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位数总共不到 1 0 4 10^4 104,而数据也只有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\n", ans);//题目要求有且只有一组符合
		else 
			printf("Not sure\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值