http://acm.hdu.edu.cn/showproblem.php?pid=1172
题意:
计算机随机产生一个四位数,玩家猜这个四位数是什么,每猜一个数计算机会告诉你猜对几个数,有几个数在正确位置上。
多组输入数据,第一行表示共有N(N<=100),次问答,每行三个整数A,B,C,猜这个四位数为A,猜对了B个数字,C个在正确位置上。N=0时输入结束。
题解:
从正面分析的话,无从下手,然后数据范围只有100,且四位数的话总共也就只有10^4,直接枚举即可
枚举的判决条件与所猜数字无关。
代码:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<iomanip> using namespace std; const int maxn=110; typedef long long ll; int n; int a[maxn],b[maxn],c[maxn]; int num; int ans; int 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() { while(cin>>n&&n) { for(int i=0; i<n; i++) cin>>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) cout<<ans<<endl; else cout<<"Not sure"<<endl; } system("pause"); return 0; }