POJ 3126 Prime Path bfs 简单

给出2个四位数的素数a,b,要求a每次变化只可以变a的4个数字的其中一个,并且变化后的数也要是素数,问a至少要变化多少次才可以变为b。

注意,a的千位数不能变化为0

 

先打出素数表,再bfs数a即可。

 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 
 5 using namespace std;
 6 
 7 const int maxn=10010;
 8 const int inf=0x3f3f3f3f;
 9 
10 bool prime[maxn];
11 bool vis[maxn];
12 
13 void init_prime()
14 {
15     memset(prime,true,sizeof prime);
16     prime[1]=false;
17     for(int i=2;i<maxn;i++)
18     {
19         if(prime[i])
20         {
21             for(int j=i*2;j<maxn;j+=i)
22                 prime[j]=false;
23         }
24     }
25     return ;
26 }
27 struct Node
28 {
29     int num,cnt;
30 };
31 
32 inline int pow(int x,int y)
33 {
34     int ret=1;
35     for(int i=1;i<=y;i++)
36         ret*=x;
37     return ret;
38 }
39 
40 int bfs(int a,int b)
41 {
42     if(a==b)
43         return 0;
44     memset(vis,false,sizeof vis);
45     Node str;
46     str.num=a;
47     str.cnt=0;
48     queue<Node>que;
49     while(!que.empty())
50         que.pop();
51     que.push(str);
52     vis[str.num]=true;
53     while(!que.empty())
54     {
55         Node u=que.front();
56         que.pop();
57         if(u.num==b)
58             return u.cnt;
59         for(int i=1;i<=4;i++)
60         {
61             for(int j=0;j<10;j++)
62             {
63                 //第i位改为j
64                 if(i==4&&j==0)
65                     continue;
66                 int x=(u.num%pow(10,i))/pow(10,i-1);
67                 if(x==j)
68                     continue;
69                 Node tmp;
70                 tmp.num=u.num-x*pow(10,i-1)+j*pow(10,i-1);
71                 if(!prime[tmp.num])
72                     continue;
73                 if(vis[tmp.num])
74                     continue;
75                 tmp.cnt=u.cnt+1;
76                 que.push(tmp);
77                 vis[tmp.num]=true;
78             }
79         }
80     }
81 }
82 
83 int main()
84 {
85     init_prime();
86     int test;
87     scanf("%d",&test);
88     while(test--)
89     {
90         int a,b;
91         scanf("%d%d",&a,&b);
92 
93         printf("%d\n",bfs(a,b));
94     }
95     return 0;
96 }
View Code

 

posted on 2015-08-01 21:40  _fukua  阅读(197)  评论(0编辑  收藏  举报