题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4474
思路:bfs,用pre[]来记录到达u的前一个结点,num[]来保存当前数的最后一位。
具体见代码:
View Code
1 #include<iostream> 2 #include<cstring> 3 #include<queue> 4 const int N=10010; 5 using namespace std; 6 int n,m; 7 int a[10]; 8 int pre[N],num[N]; 9 10 void print(int u){ 11 if(pre[u]!=-1)print(pre[u]);//pre[]保存的是形成u的前一个结点,直到为-1; 12 printf("%d",num[u]);//由于num[]保存的记录u的最后一个数字,应此应该逆序输出 13 } 14 15 void bfs(){ 16 queue<int>Q; 17 for(int i=1;i<=9;i++)if(!a[i]){ 18 int t=i%n; 19 if(t==0){ 20 printf("%d",i); 21 return ; 22 } 23 Q.push(t); 24 num[t]=i; 25 } 26 while(!Q.empty()){ 27 int u=Q.front(); 28 Q.pop(); 29 for(int i=0;i<=9;i++)if(!a[i]){ 30 int t=(u*10+i)%n; 31 if(num[t]==-1){ 32 Q.push(t); 33 pre[t]=u;//由于记录到达t的前一个结点u; 34 num[t]=i;//记录形成t的最后一位数字 35 } 36 if(t==0){ 37 print(t); 38 return ; 39 } 40 } 41 } 42 printf("-1"); 43 } 44 45 46 int main(){ 47 int _case=1; 48 while(~scanf("%d%d",&n,&m)){ 49 memset(a,0,sizeof(a)); 50 memset(pre,-1,sizeof(pre)); 51 memset(num,-1,sizeof(num)); 52 int x; 53 while(m--){ 54 scanf("%d",&x); 55 a[x]=1; 56 } 57 printf("Case %d: ",_case++); 58 bfs(); 59 printf("\n"); 60 } 61 return 0; 62 }