7 15 16 101 0
7 555 16 1111
思路:最多仅仅须要出现两个不同的数字,先尝试一个数字的情况。再搜两个数字的情况。
#include <stdio.h> #define min(A,B)(A<B?A:B) #define INF 999999999 struct N{ int len,num; bool operator<(const struct N &p) const { if(len==p.len) return num<p.num; return len<p.len; } }sin,tt; struct S{ int val,last,m,len; }que[1000000],t; int i,j; bool mod[65536]; char ans[100][1000]; void dfs(int idx) { if(que[idx].last!=-1) dfs(que[idx].last); ans[i*10+j][que[idx].len]=que[idx].val+'0'; } int main() { int n,k,temp,id,mnlen; while(~scanf("%d",&n) && n) { sin.len=INF; sin.num=INF; for(i=1;i<=9;i++) { for(j=0;j<n;j++) mod[j]=0; temp=0; for(j=1;;j++) { temp=(temp*10+i)%n; if(!temp) { tt.len=j; tt.num=i; sin=min(sin,tt); } if(!mod[temp]) mod[temp]=1; else break; } } if(sin.len<INF) { for(i=0;i<sin.len;i++) printf("%d",sin.num); puts(""); continue; } if(n<100) { printf("%d\n",n); continue; } mnlen=INF; for(i=1;i<=9;i++) { for(j=0;j<=9;j++) { if(i==j) continue; for(k=0;k<n;k++) mod[k]=0; que[0].val=i; que[1].val=j; que[0].last=-1; que[1].last=0; que[0].m=i; que[1].m=i*10+j; que[0].len=0; que[1].len=1; mod[i]=mod[i*10+j]=1; int top=0; int bottom=2; while(top<bottom) { t=que[top]; if(!t.m) { if(t.len<mnlen) { mnlen=t.len; id=i*10+j; } dfs(top); ans[i*10+j][t.len+1]=0; break; } if(i<j) { if(!mod[(t.m*10+i)%n]) { mod[(t.m*10+i)%n]=1; que[bottom].last=top; que[bottom].len=t.len+1; que[bottom].m=(t.m*10+i)%n; que[bottom++].val=i; } if(!mod[(t.m*10+j)%n]) { mod[(t.m*10+j)%n]=1; que[bottom].last=top; que[bottom].len=t.len+1; que[bottom].m=(t.m*10+j)%n; que[bottom++].val=j; } } else { if(!mod[(t.m*10+j)%n]) { mod[(t.m*10+j)%n]=1; que[bottom].last=top; que[bottom].len=t.len+1; que[bottom].m=(t.m*10+j)%n; que[bottom++].val=j; } if(!mod[(t.m*10+i)%n]) { mod[(t.m*10+i)%n]=1; que[bottom].last=top; que[bottom].len=t.len+1; que[bottom].m=(t.m*10+i)%n; que[bottom++].val=i; } } top++; } } } puts(ans[id]); } }
HDU-1664-Different Digits(BFS)
原文:http://www.cnblogs.com/mengfanrong/p/5188196.html