Problem 1122 : What is the Number in my Mind ?
問題概要
解法
答えの数字は最大でも10!通り(=360万)なのでnext_permutationで回しながら全通り調べて間に合うか……と思ったら間に合わなかったので、使う数字の候補を絞って少し枝刈りしたら通った。
ソースコード
int l,n,hit[100],blow[100]; bool use[100][10]; char tmp[11],in[100][11],ans[11]; int main() { while(scanf("%d%d",&l,&n),l) { rep(i,n) { scanf("%s%d%d",in[i],hit+i,blow+i); rep(j,10)use[i][j]=0; rep(j,l)use[i][in[i][j]-'0']=1; } int cand=0,cbit=0; rep(i,1<<10) { rep(j,n) { int cnt=0; rep(k,10)if((i&1<<k)&&use[j][k])cnt++; if(cnt!=hit[j]+blow[j])goto NI; } cand|=i; NI:; } ans[0]=0; rep(i,10)if(cand&1<<i)tmp[cbit++]=i+'0'; do { rep(i,n) { int h=0,b=0; rep(j,l) { if(tmp[j]==in[i][j])h++; else if(use[i][tmp[j]-'0'])b++; } if(h!=hit[i]||b!=blow[i])goto NEXT; } if(ans[0]!=0) { ans[0]=0; goto END; } rep(i,l)ans[i]=tmp[i]; NEXT:; reverse(tmp+l,tmp+cbit); }while(next_permutation(tmp,tmp+cbit)); END: ans[l]=0; if(ans[0])printf("%s\n",ans); else puts("NO"); } return 0; }