6 4815 2 1 5716 1 0 7842 1 0 4901 0 0 8585 3 3 8555 3 2 2 4815 0 0 2999 3 3 0
3585 Not sure
從1000到9999進行暴力枚舉。。。
需要滿足兩個條件:
1:題目所給的條件和目前枚舉的值要有相同的位數的值要相等。。
2:將目前枚舉的數和題目所給的數進行枚舉,看所給的條件的數與目前枚舉的的數的出現相同的數相等的數有多少個。。但是重復的書不算。。所以開個標志變量。。。
所以我的暴力枚舉解法如下:
/* 這題是暴力枚舉。。。從1000枚舉到10000, 所以縫合條件為: 1:枚舉到的i和給的條件3即正確位置的要吻合. 2:就是要枚舉i和給的條件2是否要吻合,即相同的位數要相同。。。 */ #include#include const int maxn=100+10; struct node { int a,b,c; }point[maxn]; int a[5],b[5]; int mark[5]; void pre_deal(int c,int d) { a[1]=c/1000; a[2]=c/100%10; a[3]=c/10%10; a[4]=c%10; b[1]=d/1000; b[2]=d/100%10; b[3]=d/10%10; b[4]=d%10; } int judge(int x,int y) { int count1,count2; count1=count2=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(mark,0,sizeof(mark)); pre_deal(x,point[y].a); for(int i=1;i<=4;i++) { if(a[i]==b[i]) count1++; } // printf(count1:%d ,count1); if(count1!=point[y].c) return 0; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { if(a[i]==b[j]&&!mark[j]) { mark[j]=1; count2++; break; } } //printf(count2:%d ,count2); if(count2!=point[y].b) return 0; else return 1; } int main() { int n,ok; int count,ans; while(scanf(%d,&n)!=EOF&&n) { count=0; for(int i=1;i<=n;i++) scanf(%d%d%d,&point[i].a,&point[i].b,&point[i].c); for(int i=1000;i<=9999;i++) { ok=1; for(int j=1;j<=n;j++) { ok=judge(i,j); if(!ok) break; } if(ok) { count++; ans=i; } if(count==2) break; } // printf(count:%d ,count); if(count==1) printf(%d ,ans); else printf(Not sure ); } return 0; } 律神他們那麼剪短的代碼 真想知道啊。。orz!!