hdu1172猜数字

传送门

解题思路:从 1000~9999 枚举给出的案例数,如果其中一个数符合给出的所有案例数,说明此数即为所猜中的数,记录猜中的个数,如果猜中的个数只有唯一的一个说明可以确定此数,否则不能确定此数!

匹配数字时:首先匹配相同位置是否有相同的数,有的话,计数存在数和位置数,然后再匹配一遍位置不相同但存在的数,且记录存在数,最后比较存在数和位置数和给出的存在数和位置数是否相等,相等即为符合!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;  
int jude(int loc[],int a,int b,int c)
{
	int flagl[5],flagt[5];// 
	int test[5];
	int bb=0,cc=0;
	memset(flagl,0,sizeof(flagl));
	memset(flagt,0,sizeof(flagt));
	test[1]=a%10,a/=10;
	test[2]=a%10,a/=10;
	test[3]=a%10,a/=10;
	test[4]=a%10;
	for(int i=1;i<=4;i++){
		if(loc[i]==test[i]){
			flagl[i]=1;// 标记此位置已经匹配过了d
 			flagt[i]=1;
 			bb++,cc++;
		}
	}
	for(int i=1;i<=4;i++){
		if(flagt[i]==0){
			for(int j=1;j<=4;j++){
				if(loc[j]==test[i]&&flagl[j]==0){
					
					bb++;
					flagl[j]=1;
					flagt[i]=1;
					break;
				}
			}
		}
	}
	if(bb==b&&cc==c)
	return 1;
	return 0;
}
int main()
{
	int n,a[105],b[105],c[105],loc[5];
	while(cin>>n){
		if(n==0){
			break; 
		}
		int cnt=0;
		int record;
		for(int i=0;i<n;i++){
			cin>>a[i]>>b[i]>>c[i];
		}
		for(int i=1000;i<=9999;i++){
			int temp=i,flag=1;
			loc[1]=temp%10,temp/=10;
			loc[2]=temp%10,temp/=10;
			loc[3]=temp%10,temp/=10;
			loc[4]=temp%10;
			for(int j=0;j<n;j++){
				if(jude(loc,a[j],b[j],c[j])==0){
					flag=0;
				}
			}
			if(flag){
				cnt++;
				record=i;
			}
			if(cnt>=2){
				break;
			}
		}
		if(cnt==1){
			cout<<record<<endl;
		}
		else
		cout<<"Not sure"<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值