BFS/poj 3126 prime path

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 int n,x,y;
 7 bool v[20000];
 8 struct point
 9 {
10     int x;
11     int step;
12 };
13 
14 int change(int x,int y,int z)
15 {
16     if (z==4) return (x/10)*10+y;
17     else if (z==3)
18     {
19         int t=y*10+x%10;
20         return (x/100)*100+t;
21     }
22     else if (z==2)
23     {
24         int t=y*100+x%100;
25         return (x/1000)*1000+t;
26     }
27     else if (z==1)
28     {
29         return y*1000+(x%1000);
30     }
31 }
32 
33 bool prime(int x)
34 {
35     if (x==2 || x==3) return true;
36     if (x<=1 || x%2==0) return false;
37     for (int i=3;i<=sqrt(x);i++)
38         if (x%i==0) return false;
39     return true;
40 }
41 
42 void bfs(int sx,int ex)
43 {
44     memset(v,0,sizeof(v));
45     queue<point>que;
46     point now,next;
47     now.x=sx;
48     now.step=0;
49     v[sx]=1;
50     que.push(now);
51     while (!que.empty())
52     {
53         now=que.front();
54         que.pop();
55         if (now.x==ex)
56         {
57             printf("%d\n",now.step);
58             return ;
59         }
60 
61         for (int i=0;i<=9;i++)
62             for (int j=1;j<=4;j++)
63             {
64                 if (i==0 && j==1) continue;
65                 next.x=change(now.x,i,j);
66                 if (prime(next.x) && !v[next.x])
67                 {
68                     v[next.x]=1;
69                     next.step=now.step+1;
70                     que.push(next);
71                 }
72             }
73 
74     }
75     printf("Impossible\n");
76 }
77 int main()
78 {
79     scanf("%d",&n);
80     for (int t=1;t<=n;t++)
81     {
82         scanf("%d%d",&x,&y);
83         bfs(x,y);
84     }
85     return 0;
86 }

 

posted @ 2014-12-05 21:43  NicoleLam  阅读(138)  评论(0编辑  收藏  举报