hdu 4474

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值