hdu4474 bfs求k的最小的倍数(巧妙)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 int pre[10010],num[10010],a[10005],n;
 7 void print(int x)
 8 {
 9     if (pre[x]!=-1) print(pre[x]);
10     printf("%d",num[x]);
11 }
12 void bfs(int x)
13 {
14     queue<int>q;
15     while (!q.empty()) q.pop();
16     for (int i=1;i<=9;i++)
17     {
18         if (i%n==0&&a[i]==0) {printf("%d",i); return; }
19         if (a[i]==0) {num[i]=i;  q.push(i); }
20     }
21     while (!q.empty())
22     {
23         int x=q.front(); q.pop();
24         for (int i=0;i<=9;i++)
25             if (!a[i])
26         {
27             int y=(x*10+i)%n;
28             if (num[y]==-1) {q.push(y); pre[y]=x; num[y]=i; }
29             if (y==0) {print(y); return; }
30         }
31     }
32     printf("-1");
33 }
34 int main()
35 {
36     int cnt=0,m,i,x;
37     while (~scanf("%d%d",&n,&m))
38     {
39         memset(a,0,sizeof(a));
40         memset(num,-1,sizeof(num));
41         memset(pre,-1,sizeof(pre));
42         for (i=1;i<=m;i++)
43         {
44             scanf("%d",&x);
45             a[x]=1;
46         }
47         printf("Case %d: ",++cnt);
48         bfs(n);
49         printf("\n");
50     }
51 }

http://acm.hdu.edu.cn/showproblem.php?pid=4474

posted on 2014-09-09 23:22  xiao_xin  阅读(124)  评论(0编辑  收藏  举报

导航