http://acm.hust.edu.cn/vjudge/contest/view.action?cid=36366#problem/J
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
bool num[10001],used[10001];
int s,e;
void Prim()
{
memset(num,true,sizeof(num));
for(int i=2;i*i<10001;i++)
{
if(num[i])
{
for(int j=i+i;j<10000;j+=i)
num[j]=false;
}
}
memset(num,false,1000);
}
struct Point{
int x,step;
};
int d[4]={1,10,100,1000};
int BFS(int x)
{
queue<Point> que;
Point tp,ans;
int tx;
ans.x=x,ans.step=0;
used[x]=false,que.push(ans);
while(!que.empty())
{
tp=que.front();
que.pop();
for(int i=0;i<4;i++)
for(int j=0;j<=9;j++)
if(i==3&&j==0)continue;
else
{
if(j!=(tp.x/d[i]%10))
{
tx=((tp.x/d[i]/10)*10+j)*d[i]+tp.x%d[i];
if(used[tx])
{
used[tx]=false,ans.x=tx,ans.step=tp.step+1,que.push(ans);
if(ans.x==e)return ans.step;
}
}
}
}
}
int main()
{
int T;
cin>>T;
Prim();
while(T--)
{
cin>>s>>e;
memcpy(used,num,10000);
if(s==e)cout<<"0"<<endl;
else cout<<BFS(s)<<endl;
}
}