题意:给一个四位数的素数,求通过几步变换(一次只能换一个位置的数,且变换过程中只能出现素数)变为目标四位数
分析:素数筛法+BFS,BFS时更换一个数字如果符合条件就加入队列
代码:
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef pair <int,int> pii;
const int maxn = 10000 + 5 , inf = 0x3f3f3f3f;
bool vis[maxn];
void isPrime(){
memset(vis,true,sizeof(vis));
vis[1]=false;
vis[2]=true;
for(int i=2;i<=maxn;i++){
for(int j=i*2;j<=maxn;j+=i){
vis[j]=false;
}
}
}
struct node{
int x,d;
node(int xx,int dd):x(xx),d(dd){};
};
bool done[maxn];
int Start,End;
int bfs(int d){
mem(done);
queue<node>q;
while(!q.empty())q.pop();
q.push(node(Start,d));
while(!q.empty()){
node now = q.front();q.pop();
if(now.x==End) return now.d;
else{
for(int i=1;i<=9;i+=2){
int temp = now.x/10*10+i;
if(vis[temp]&&temp!=now.x&&!done[temp]){
done[temp]=true;
q.push(node(temp,now.d+1));
}
}
for(int i=0;i<=9;i++){
int nn = now.x%10;
int temp = now.x/100*100+i*10+nn;
if(vis[temp]&&temp!=now.x&&!done[temp]){
done[temp]=true;
q.push(node(temp,now.d+1));
}
}
for(int i=0;i<=9;i++){
int nn = now.x%100;
int temp = now.x/1000*1000+i*100+nn;
if(vis[temp]&&temp!=now.x&&!done[temp]){
done[temp]=true;
q.push(node(temp,now.d+1));
}
}
for(int i=1;i<=9;i++){
int nn = now.x%1000;
int temp = i*1000+nn;
if(vis[temp]&&temp!=now.x&&!done[temp]){
done[temp]=true;
q.push(node(temp,now.d+1));
}
}
}
}
return -1;
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
isPrime();
while(T--){
cin>>Start>>End;
int ans = bfs(0);
if(ans==-1) cout<<"Impossible"<<endl;
else cout<<ans<<endl;
}
}