HDU 1172-猜数字

来源:互联网 发布:vm14安装ubuntu 教程 编辑:程序博客网 时间:2024/05/17 01:13

点击打开题目——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