HDU 1172 猜数字(暴力枚举)

Problem Description

猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。

Input

输入数据有多组。每组的第一行为一个正整数N(1<=N<=100),表示在这段对话中共有N次问答。在接下来的N行中,每行三个整数A,B,C。gameboy猜这个四位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。当N=0时,输入数据结束。

Output

每组输入数据对应一行输出。如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure"。

Sample Input

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

Sample Output

3585
Not sure

这题一看,给定的都是四位数,用暴力直接循环搜很划算。
我的思路:对于每组测试样例,枚举1000—9999的所有四位数,然后再对每个四位数进行验证(通过panduan函数验证),看是否满足测试样例所给的所有条件。如果不能唯一确定(一个都没有或者多于一个)那就输出Not sure

写完运行感觉没问题提交一遍过了就算了,代码格式啥的没太注意

#include<iostream>
#include<memory.h>
using namespace std;

const int maxn = 105;
int n;
int a[maxn];
int b[maxn];
int c[maxn];
int ax[5];
int ay[5];
int tag[5];

bool panduan(int x, int j)
{
	memset(tag, 0, sizeof(tag));
	int y = a[j];
	ax[1] = x % 10;		//个 
	x /= 10;
	ax[2] = x % 10;		//十 
	x /= 10;
	ax[3] = x % 10;		//百 
	x /= 10;
	ax[4] = x;				//千 

	ay[1] = y % 10;
	y /= 10;
	ay[2] = y % 10;
	y /= 10;
	ay[3] = y % 10;
	y /= 10;
	ay[4] = y;
	
	int cnt1 = 0;
	for(int i = 1;i <= 4;i++)
	{
		for(int k = 1;k <= 4;k++)
		{
			if(ax[i] == ay[k] && tag[k] != 1)
			{
				tag[k] = 1;
				cnt1++;
				break;
			}
		}
	}
	
	int cnt2 = (ax[1] == ay[1]) + (ax[2] == ay[2]) + (ax[3] == ay[3]) + (ax[4] == ay[4]);
	if(cnt2 != c[j])
		return false;
	if(cnt1 != b[j])
		return false;
	return true;
}

int f()
{
	int ans = 0;							//记录满足的数 
	bool flag = true;
	for(int i = 1000;i <= 9999;i++)			//枚举所有的四位数 
	{
		for(int j = 1;j <= n && flag;j++)			//枚举所有的测试数据 
		{
			if(!panduan(i, j))
			{
				flag = false;
			}
		}
		if(flag == true)
		{
			if(ans == 0)
				ans = i;
			else
				return 0;
		}
		else
			flag = true;
	}
	return ans;
}

int main()
{
	while(scanf("%d", &n), n != 0)
	{
		for(int i = 1;i <= n;i++)
		{
			cin >> a[i] >> b[i] >> c[i];
		}
		int res = f();
		if(res != 0)
			cout << res << endl;
		else 
			cout << "Not sure" << endl;
	}
	return 0;
}

15MS, 还挺快的

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值