hdu 4474

来源:互联网 发布:淘宝装修拓展编码大全 编辑:程序博客网 时间:2024/06/05 03:34

题目链接: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 }

 

0 0