思路:
素数打表,搜
#include <iostream>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int a[10005];
int vis[10005];
int ans=0x3f3f3f3f;
int solve(int s[])
{
int cur=0;
for(int k=3;k>=0;k--)
{
cur=cur*10+s[k];
}
return cur;
}
struct node
{
int num,step;
};
void bfs(int n,int m)
{
node t;
t.num=n,t.step=0;
queue<node >q;
q.push(t);
while(!q.empty())
{
t=q.front();
q.pop();
if(t.step>ans)
break;
if(t.num==m)
{
ans=t.step;
continue;
}
int s[5],cur=0;
for(int i=0;i<4;i++)
{
s[i]=t.num%10;
t.num/=10;
}
for(int i=0;i<10;i++)
{
for(int j=0;j<4;j++)
{
int fir=s[j];
s[j]=i;
cur=solve(s);
if(a[cur]&&!vis[cur])
{
vis[cur]=1;
node c;
c.num=cur;
c.step=t.step+1;
q.push(c);
}
s[j]=fir;
}
}
}
}
int main()
{
int T;
cin>>T;
for(int i=1000;i<=9999;i++)
{
int yes=1;
for(int k=2;k<=sqrt(i);k++)
{
if(i%k==0)
{
yes=0;
break;
}
}
if(yes)
{
a[i]=1;
// cout<<i<<" ";
}
}
while(T--)
{
ans=0x3f3f3f3f;
memset(vis,0,sizeof(vis));
int n,m;
cin>>n>>m;
bfs(n,m);
if(ans==0x3f3f3f3f)
cout<<"Impossible"<<endl;
else
cout<<ans<<endl;
}
}