题目链接:http://172.16.200.33/JudgeOnline/problem.php?id=1002
题意:给你两个四位数的素数,求最少经过多少步的变化能够从一个素数变到另一个素数。在变得过程中,要求都是素数,而且每个新的数和原来的数只有一位不一样。
思路:因为是四位的素数,所以先对素数打表,然后BFS,每次进入队列的是八个只有一个数字不同的四位数,并且还要是素数就入队
#include <cstdio> #include <queue> #include <cmath> #include <cstring> #include <iostream> using namespace std; #define M 10000 int prime[M]; bool isprime(int x) //素数打表 { for(int i=2;i<=sqrt(x);i++) if(x%i==0) return false; return true; } void init() { for(int i=1001;i<=9999;i++) { if(isprime(i)) prime[i]=1; else prime[i]=0; } } int bfs(int a,int b) { queue<int>q; bool vis[M]; int cout[M],t[4],temp; memset(vis,false,sizeof(vis)); memset(cout,0,sizeof(cout)); q.push(a);//入队 vis[a]=true; while(!q.empty())//判断队列是否为空 { int x=q.front(); q.pop(); t[0]=x/1000; t[1]=x/100%10; t[2]=x/10%10; t[3]=x%10; for(int j=0;j<4;j++) { int temp=t[j]; for(int i=0;i<10;i++) if(i!=temp) { t[j]=i; int y=t[0]*1000+t[1]*100+t[2]*10+t[3]; if(!vis[y]&&prime[y]) { cout[y]=cout[x]+1; vis[y]=true; q.push(y); } if(y==b) return cout[y]; } t[j]=temp; } if(x==b) return cout[x]; } return -1; } int main() { init(); int n,x,t,f; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&x); f=bfs(n,x); if(f!=-1) printf("%d ",f); else printf("Impossible "); } return 0; }