首页 > 代码库 > POJ 3126 Prime Path

POJ 3126 Prime Path

题意:给两个四位数素数X,Y,每次可变换X的一位数字,变换后的数字应为素数,问X变为Y的最小变换次数。

分析:宽度搜索,每次将所有满足条件的,改变X的某一位数的后的素数入队列。

代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <vector>
  5 #include <queue>
  6 #include <cmath>
  7 #include <stack>
  8 #include <set>
  9 #include <map>
 10 #include <algorithm>
 11 using namespace std;
 12 #define ll long long
 13 #define inf 0x3f3f3f3f
 14 int n,m;
 15 struct node
 16 {
 17     int e,t;
 18 };
 19 int v[10001];
 20 bool is(int x)//判断x是否为素数
 21 {
 22     if(x==0||x==1)  return 0;
 23     else if(x==2||x==3)  return 1;
 24     else
 25     {
 26         for(int i = 2;i<=(int)sqrt(x);i++)
 27             if(x%i==0)
 28                 return 0;
 29         return 1;
 30     }
 31 }
 32 int bfs()
 33 {
 34     int i,j,a,b,c,d;
 35     node x,y;
 36     queue<node> q;
 37     x.e=n;x.t=0;
 38     v[x.e]=1;
 39     q.push(x);
 40     while(!q.empty())
 41     {
 42         y=q.front();
 43         q.pop();
 44         if(y.e==m) return y.t;
 45         a=y.e%10;
 46         b=y.e/10%10;
 47         c=y.e/100%10;
 48         d=y.e/1000;
 49         for(i=1;i<=9;i+=2)//保证个位为奇数。
 50         {
 51             if(i!=a)
 52             {
 53                 x.e=y.e-a+i;//个位换为i
 54                 if(is(x.e)&&!v[x.e])
 55                 {
 56                     v[x.e]=1;
 57                     x.t=y.t+1;
 58                     q.push(x);
 59                 }
 60             }
 61         }
 62         for(i=0;i<=9;i++)
 63         {
 64             if(i!=b)
 65             {
 66                 x.e=y.e-b*10+i*10;
 67                 if(is(x.e)&&!v[x.e])
 68                 {
 69                     v[x.e]=1;
 70                     x.t=y.t+1;
 71                     q.push(x);
 72                 }
 73             }
 74         }
 75         for(i=0;i<=9;i++)
 76         {
 77             if(i!=c)
 78             {
 79                 x.e=y.e-c*100+i*100;
 80                 if(is(x.e)&&!v[x.e])
 81                 {
 82                     v[x.e]=1;
 83                     x.t=y.t+1;
 84                     q.push(x);
 85                 }
 86             }
 87         }
 88         for(i=1;i<=9;i++)
 89         {
 90             if(i!=d)
 91             {
 92                 x.e=y.e-d*1000+i*1000;
 93                 if(is(x.e)&&!v[x.e])
 94                 {
 95                     v[x.e]=1;
 96                     x.t=y.t+1;
 97                     q.push(x);
 98                 }
 99             }
100         }
101     }
102     return -1;
103 }
104 int main()
105 {
106     int i,t;
107     scanf("%d",&t);
108     while(t--)
109     {
110         scanf("%d %d",&n,&m);
111         memset(v,0,sizeof v);
112         int k=bfs();
113         if(k!=-1)
114         printf("%d\n",k);
115         else printf("Impossible\n");
116     }
117     return 0;
118 }

 

POJ 3126 Prime Path