HDU 1172猜数字(直接暴力枚举即可)
发布时间: 2013-10-18 20:53:13 作者: rapoo
HDU 1172猜数字(直接暴力枚举即可)
64815 2 15716 1 07842 1 04901 0 08585 3 38555 3 224815 0 02999 3 30
3585Not sure
#include<iostream>#include<cstring>#include<string>#include<cmath>#include<cstdio>#include<map>using namespace std;int a[105],b[105],c[105];int cal1(int a,int b) //不一定对应{ int ans=0; int p1[4],p2[4],visi[4]; int tt=0,i,j; while(a) { p1[tt++]=a%10; a/=10; } tt=0; while(b) { p2[tt++]=b%10; b/=10; } memset(visi,0,sizeof(visi)); for(i=0;i<4;i++) for(j=0;j<4;j++) { if(p1[i]==p2[j]&&!visi[j]) { visi[j]=1; ans++; break; //找到一个就跳出 } } return ans;}int cal2(int a,int b) //每一位都要对应{ int ans=0; int p1[4],p2[4]; int tt=0,i; while(a) { p1[tt++]=a%10; a/=10; } tt=0; while(b) { p2[tt++]=b%10; b/=10; } for(i=0;i<4;i++) if(p1[i]==p2[i]) ans++; return ans;}int main(){ int n,i,j; while(scanf("%d",&n)&&n) { int flag=0; int res; for(i=0;i<n;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]); for(i=1e3;i<1e4;i++) { int cnt=0; for(j=0;j<n;j++) { if(cal1(i,a[j])==b[j]&&cal2(i,a[j])==c[j]) cnt++; else break; } if(cnt==n&&flag==1) //说明存在两个或以上 { flag=2; break; } else if(cnt==n&&!flag) //找到了一个 { flag=1; res=i; } } if(flag==2) puts("Not sure"); else printf("%d\n",res); } return 0;}/*64815 2 15716 1 07842 1 04901 0 08585 3 38555 3 224815 0 02999 3 30*///31MS