10000-1000内的素数就只有那么多啊,BFS很快就能得出解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
bool isPrime(int n)
{
int i;
for(i=2;i<=sqrt((double)n);i++)
{
if(n%i==0)
break;
}
if(i>sqrt((double)n)&&n>=2)
return true;
else
return false;
}
int T,s,e,ts,tn,ttn;
int v[10000];
queue<int> q;
int bfs()
{
int now,i,j;
while (!q.empty())
q.pop();
q.push(s);
v[s]=0;
while (!q.empty())
{
now=q.front();
//printf("%d\n",now);
if (now == e)
return v[now];
for (i=1; i<=1000; i*=10)
{
tn=now%(i*10);
tn/=i;
for (j=0; j<10; j++)
{
if (i == 1000 && j == 0)
{
continue;
}
// printf("%d\n",ttn);
//getchar();
ttn=now+(j-tn)*i;
if (ttn < 1000 || ttn >= 10000)
continue;
if (isPrime(ttn) == true && v[ttn] == -1)
{
v[ttn]=v[now]+1;
q.push(ttn);
}
}
}
q.pop();
}
return -1;
}
int main()
{
int ans;
scanf("%d",&T);
while (T--)
{
memset(v,-1,sizeof(v));
scanf("%d%d",&s,&e);
if (s == e)
{
printf("0\n");
continue;
}
ans=bfs();
if (ans == -1)
{
printf("Impossible\n");
}
else
printf("%d\n",ans);
}
}