Prime Path
题目链接:https://vjudge.net/contest/277958#problem/J
题意:每组测试案例给出两个数a,b,从数字a开始,每次只改变当前数中的一位数,使之仍为一个素数,问经过多少步骤能够得到数字b。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<algorithm> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 #include<iostream> 6 using namespace std; 7 int cnt[10000]; 8 bool vis[10000]; 9 bool prime[10000]; 10 void init() 11 { 12 int key; 13 for (int i = 1000;i <= 9999;i++){ 14 key = 1; 15 for (int j = 2;j < i;j++){ 16 if (i%j == 0){ 17 key = 0; 18 break; 19 } 20 } 21 if (key) 22 prime[i] = true; 23 } 24 } 25 26 int bfs(int snum,int endnum) 27 { 28 memset(vis,0,sizeof(vis)); 29 memset(cnt,0,sizeof(cnt)); 30 queue<int>q; 31 vis[snum]=1; 32 q.push(snum); 33 int bit[10]; 34 while(!q.empty()){ 35 int temp=q.front(); 36 q.pop(); 37 if(temp==endnum) 38 return cnt[endnum]; 39 bit[1]=temp/1000; bit[2]=(temp/100)%10; bit[3]=(temp/10)%10; bit[4]=temp%10; 40 for(int bi=1;bi<=4;bi++){ 41 int temp1=bit[bi]; 42 for(int i=0;i<10;i++){ 43 if(bi==1 && i==0) 44 continue; 45 bit[bi]=i; 46 int sum=bit[1]*1000+bit[2]*100+bit[3]*10+bit[4]; 47 if(prime[sum]&&(!vis[sum])){ 48 vis[sum]=1; 49 cnt[sum]=cnt[temp]+1; 50 q.push(sum); 51 } 52 } 53 bit[bi]=temp1; 54 } 55 } 56 return -1; 57 } 58 int main() 59 { 60 init(); 61 int snum,endnum,ans,T; 62 scanf("%d",&T); 63 while(T--){ 64 scanf("%d%d",&snum,&endnum); 65 ans=bfs(snum,endnum); 66 if(ans==-1) 67 printf("Impossible\n"); 68 else 69 printf("%d\n",ans); 70 } 71 return 0; 72 }