3126 | Accepted | 200K | 0MS | C++ | 1902B |
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
//#pragma warning(disable:4996)
using namespace std;
const int MAX_N=10005;
const int INF=0x3fffffff;
bool isPrim[MAX_N];
void createPrimTable(){
memset(isPrim,1,sizeof(isPrim));
isPrim[0]=isPrim[1]=false;
isPrim[2]=true;
for(int i=2;i*i<=10000;++i){
if(isPrim[i])
for(int j=i*i;j<10000;j+=i)
isPrim[j]=false;
}
}
int d[MAX_N];
int dfs(int s,int g){
fill(d,d+MAX_N+1,INF);
queue<int> q;
q.push(s);
d[s]=0;
while(!q.empty()){
int p=q.front();q.pop();
if(p==g) return d[p];
int thousandBit=p/1000;
int hundredBit=p/100-10*thousandBit;
int tenBit=(p%100)/10;
int oneBit=p%10;
for(int i=1;i<=9;i++){
int tmp=p-(thousandBit-i)*1000;
if(isPrim[tmp]&&d[tmp]==INF){
q.push(tmp);
d[tmp]=d[p]+1;
}
}
for(int i=0;i<=9;i++){
int tmp=p-(hundredBit-i)*100;
if(isPrim[tmp]&&d[tmp]==INF){
q.push(tmp);
d[tmp]=d[p]+1;
}
}
for(int i=0;i<=9;i++){
int tmp=p-(tenBit-i)*10;
if(isPrim[tmp]&&d[tmp]==INF){
q.push(tmp);
d[tmp]=d[p]+1;
}
}
for(int i=1;i<=9;i+=2){
int tmp=p-(oneBit-i)*1;
if(isPrim[tmp]&&d[tmp]==INF){
q.push(tmp);
d[tmp]=d[p]+1;
}
}
}
return d[g];
}
int main(){
createPrimTable();
int n;
scanf("%d",&n);
while(n--){
int s,g;
scanf("%d%d",&s,&g);
dfs(s,g);
if(d[g]!=INF)
printf("%d\n",d[g]);
else
printf("Impossible\n");
}
return 0;
}