HDU 1172-猜数字

2 篇文章 0 订阅

点击打开题目——HDU 1172


        这是一道比较简单的题。如果直接从正面解题,因为约束条件非常繁琐,所以实现起来比较麻烦。由于4位数只有10000-1000个,并且测试的数据不超过100组,所以可以采取枚举的方法,对每个四位数进行N次判断,如果N个条件全部符合,则说明当前四位数可能是正确答案。

      (!!!注意题目问的是能否确定这个四位数)


#include <iostream>
using namespace std;

int a[101],b[101],c[101];//猜的数为a[i]、猜对了b[i]个数字、c[i]个在正确的位置
int ans=0;//符合条件的四位数

//判断当前四位数是否符合第y次问答的结果
bool check(int x,int n)
{
	int s[4],t[4];//当前四位数及第y次猜测的四位数
	int pa=a[n];
	for(int i=3;i>=0;i--)
	{
		s[i]=x%10,x/=10;
		t[i]=pa%10,pa/=10;
	}

	int check_num=0,check_pos=0;//猜对数字的个数、正确位置的个数

	//计算正确位置的个数
	for(int i=0;i<4;i++)
		if(s[i]==t[i]) check_pos++;

	//计算猜对数字的个数
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			if(s[i]==t[j])
			{
				check_num++;
				t[j]=-1;//防止一个数字被多次判断
				break;
			}
		}
	}

	return check_num==b[n]&&check_pos==c[n];
}

int main()
{
	int n;
	while(cin>>n&&n)//每组n次问答
	{
		for(int i=0;i<n;i++)
			cin>>a[i]>>b[i]>>c[i];

		ans=0;//答案的初值记为0

		//枚举每一个值,并判断是否符合条件
		for(int i=1000;i<10000;i++)
		{
			int num=0;
			for(;num<n;num++)
				if(!check(i,num)) break;//不符合条件则直接退出循环

			if(num==n)//下面是符合条件的
			{
				if(ans!=0)//此时说明有多个可能的解
				{
					ans=-1;//多个解的标志
					cout<<"Not sure"<<endl;
					break;
				}
				ans=i;
			}
		}
		if(ans==0)//此时说明无解
			cout<<"Not sure"<<endl;
		else if(ans!=-1)//只有1一个解
			cout<<ans<<endl;
	}
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值