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 }