POJ-3126 Prime Path
题意:给出两个四位素数a、b,问从a到b最少变几次(每次变1位并且只能为素数)。
思路:bfs。
题目链接:http://poj.org/problem?id=3126
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <queue> 7 #include <algorithm> 8 #include <iostream> 9 using namespace std; 10 const int N=2000; 11 12 typedef struct In{ 13 int num; 14 int t; 15 }In; 16 In start; 17 queue<In>Q; 18 int a,b; 19 bool isprime[N*5],vis[N*5]; 20 21 int bfs(In c){ 22 In now,next; 23 now=c; 24 Q.push(now); 25 while(!Q.empty()){ 26 now=Q.front(); 27 Q.pop(); 28 if(now.num==b) return now.t; 29 for(int i=1;i<10;i++){ 30 next.num=now.num/10*10+i; 31 if(!isprime[next.num]&&!vis[next.num]){ 32 vis[next.num]=true; 33 next.t=now.t+1; 34 Q.push(next); 35 } 36 } 37 for(int i=0;i<10;i++){ 38 next.num=now.num/100*100+now.num%10+i*10; 39 if(!isprime[next.num]&&!vis[next.num]){ 40 vis[next.num]=true; 41 next.t=now.t+1; 42 Q.push(next); 43 } 44 } 45 for(int i=0;i<10;i++){ 46 next.num=now.num/1000*1000+now.num%100+i*100; 47 if(!isprime[next.num]&&!vis[next.num]){ 48 vis[next.num]=true; 49 next.t=now.t+1; 50 Q.push(next); 51 } 52 } 53 for(int i=1;i<10;i++){ 54 next.num=now.num%1000+i*1000; 55 if(!isprime[next.num]&&!vis[next.num]){ 56 vis[next.num]=true; 57 next.t=now.t+1; 58 Q.push(next); 59 } 60 } 61 } 62 return 0; 63 } 64 65 int main(){ 66 67 // freopen("data.in","r",stdin); 68 // freopen("data.out","w",stdout); 69 70 for(int i=2;i<=N*5;i++) 71 if(!isprime[i]) 72 for(int j=2;i*j<=N*5;j++) 73 isprime[i*j]=true; 74 int T; 75 scanf("%d",&T); 76 while(T--){ 77 scanf("%d%d",&a,&b); 78 memset(vis,false,sizeof(vis)); 79 vis[a]=true; 80 start.num=a; start.t=0; 81 while(!Q.empty()) Q.pop(); 82 int ans=bfs(start); 83 printf("%d\n",ans); 84 } 85 return 0; 86 }