点击打开题目——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,x/=10; t[i]=pa,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; }