很久以前做过了,当时以为是搜索,不大会做。后来还是看别人的方法,觉得不是简洁。
今天再做一次,1Y了。水题一道,但有很多技巧
1.如果有多个答案,那就不是正确的解
2.正确的对位数是很容易求的,难的是才对的那个要仔细写。
3.代码的方法直接纯暴力了。
#include <stdio.h> #include <string.h> #define maxn 120 int n; int gus[maxn] , pos[maxn] , rig[maxn]; int test_pos(int a,int b){ int cnt = 0; while(a > 0){ if(a%10 == b%10) cnt++; a/=10;b/=10; } return cnt; } int vis1[10],vis2[10]; int test_rig(int a,int b){ int _b=b; int cnt = 0; memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); while(a > 0){ vis1[a%10]++; a/=10; } while(b > 0){ int t = b%10; vis2[b%10]++; b /= 10; } for(int i=0;i<10;i++) { if(vis1[i] > 0 && vis2[i] > 0){ int tx = vis1[i]<vis2[i]?vis1[i]:vis2[i]; cnt += tx; } } return cnt; } bool test(int num) { for(int i=1;i<=n;i++) { int k1,k2; int ok1=(rig[i] == (k1=test_rig(gus[i],num))); int ok2=(pos[i] == (k2=test_pos(gus[i],num))); if(!ok1 || !ok2) return false; } return true; } int vio() { int ok=0 ,cnt=0; for(int i=1000;i<=9999;i++) { if(test(i)){ if(cnt == 0) ok=i; cnt++; } } if(cnt > 1 || cnt == 0) return 0; return ok; } int main() { while(scanf("%d",&n),n) { int t; for(int i=1;i<=n;i++) scanf("%d %d %d",&gus[i],&rig[i],&pos[i]); if((t=vio()) > 0) printf("%d ",t); else printf("Not sure "); } return 0; }