#include "string"
#include "iostream"
#include "cstdio"
#include "cmath"
#include "set"
#include "queue"
#include "vector"
#include "cctype"
#include "sstream"
#include "cstdlib"
#include "cstring"
#include "stack"
#include "ctime"
#include "algorithm"
#define pa pair<int,int>
#define Pi M_PI
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
using namespace std;
typedef long long LL;
const int M=55;
int A,B;
bool vis[10005];
struct node
{
int val,step;
node(int a,int b):val(a),step(b){} //
};
bool isprime[10005];
void init()
{
memset(isprime,1,sizeof(isprime));
isprime[1]=false;
for(int i=2;i<=10000;++i)if(isprime[i])
{
for(int j=i+i;j<=10000;j+=i)
isprime[j]=false;
}
}
int turn(int old,int n,int val)
{
int num[4]={0};
for(int i=0;i<4;++i)
{
num[i]=old%10;
old/=10;
}
num[n]=val;
int newnum=0;
for(int i=3;i>=0;--i)
newnum=newnum*10+num[i];
return newnum;
}
int bfs()
{
memset(vis,0,sizeof(vis));
queue<node>q;
q.push(node(A,0));
vis[A]=true;
while(!q.empty())
{
node s=q.front();
q.pop();
for(int i=0;i<4;++i) //bfs所有情况
{
for(int j=0;j<10;++j)
{
if(i==3&&j==0)
continue;
int nv=turn(s.val,i,j);
if(!isprime[nv]||vis[nv])
continue;
vis[nv]=true;
int ns=s.step+1;
if(nv==B)
return ns;
q.push(node(nv,ns));
}
}
}
return -1;
}
int main()
{
init();
int n;
cin>>n;
while(n--)
{
cin>>A>>B;
int ans=(A==B)?0:bfs();
if(ans==-1||!isprime[A]||!isprime[B])
puts("Impossible");
else
cout<<ans<<endl;
}
return 0;
}
POJ 3126 Prime Path (BFS)
最新推荐文章于 2021-10-11 16:57:25 发布