分析:
这题是在1000-10000之间,从一个素数变换到另一个素数。我们会想到先打印素数表,然后进行搜索。
另外,对素数的变换,我们应进行为的变换。采用queue来存。
代码如下:
#include<cstdio> #include<cmath> #include<queue> #include<cstring> using namespace std; int k,m; int a[4]={1,10,100,1000}; int visit[10000],prime[10000]; void get_prime() //素数打表 { int i,j; for(i=4;i<=10000;i+=2){ prime[i]=1; } int N=(int)sqrt(10000.0); for(i=3;i<=N;i+=2){ if(!prime[i]) for(j=i*i;j<10000;j+=2*i) prime[j]=1; } } int prime_BFS() { queue<int>Q; Q.push(k); visit[k]=0; while(!Q.empty()) { int s=Q.front(); Q.pop(); if(s==m) return visit[s]; for(int i=0;i<4;i++) { for(int j=0;j<10;j++) { int x=s/(a[i]*10); //这个变换不错,参考牛人的代码。 int y=s%a[i]; int num=x*a[i]*10+j*a[i]+y; if(num>1000&&visit[num]==-1&&!prime[num]) //num>1000排除了首位为零的。 { Q.push(num); visit[num]=visit[s]+1; } } } } puts("Impossible"); } int main() { int n; get_prime(); while(scanf("%d",&n)!=-1) while(n--) { memset(visit,-1,sizeof(visit)); scanf("%d%d",&k,&m); // if(!prime[k]&&!prime[m]); printf("%d\n",prime_BFS()); } return 0; }