hdu 4474

2012 ICPC/ACM 成都现场赛K题

题意:输入n,m,m个数字
n的最小倍数:要求不存在题中给的m个数字0~9;即x%n==0;不存在输出-1;
结果会爆64位,所以用符合条件的数字进行bfs,最早找到的就是答案;
记录:pre[t]记录到达t的前一节点u,num[t]记录形成t的最后一位数字。

具体看代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #define N 10100
 5 using namespace std;
 6 int pre[N],num[N],a[10];
 7 int n,m,x;
 8 void init()
 9 {
10     memset(pre,-1,sizeof(pre));
11     memset(num,-1,sizeof(num));
12     memset(a,0,sizeof(a));
13 }
14 void print(int u)
15 {
16     if (pre[u]!=-1) print(pre[u]);
17     printf("%d",num[u]);
18 }
19 int bfs()
20 {
21     int i,j,t;
22     queue<int>q;
23     for (i=1;i<10;++i)
24     {
25         if (!a[i])
26         {
27             t=i%n;
28             if (t==0) { printf("%d",i);return 0;}
29             q.push(t);num[t]=i;
30         }
31     }
32     while (!q.empty())
33     {
34         int u=q.front();
35         q.pop();
36         for (i=0;i<10;++i)
37         {
38             if (!a[i])
39             {
40                 t=(10*u+i)%n;
41                 if (num[t]==-1) {q.push(t);pre[t]=u;num[t]=i;}
42                 if (t==0)
43                 {
44                     print(t);
45                     return 0;
46                 }
47             }
48         }
49     }
50     printf("-1");
51     return 0;
52 }
53 int main ()
54 {
55     int i,j,k=0;
56     while (scanf("%d%d",&n,&m)!=EOF)
57     {
58         init();
59         while (--m>=0)
60         {
61             scanf("%d",&x);
62             a[x]=1;
63         }
64         printf("Case %d: ",++k);
65         bfs();
66         printf("\n");
67     }
68     return 0;
69 }

 

posted @ 2012-11-23 00:47  _hikaru__  阅读(413)  评论(0编辑  收藏  举报