poj 3126 Prime Path
#include <iostream> //bfs
#include <algorithm>
#include<deque>
using namespace std;
bool prime(int n)
{
for(int i=2;i*i<=n;++i)
if(n%i==0)
return false;
return true;
}
bool p[10000],visited[10000];
struct node
{
int n,c;
}ans[10000];
void init()
{
for(int i=1000;i<10000;++i)
if(prime(i))
p[i]=1;
}
int main()
{
init();
int t,a,b,index[4],j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
ans[0].n=a;ans[0].c=0;
deque<node> col;
col.push_back(ans[0]);
j=0;
memset(visited,0,sizeof(visited));
visited[a]=1;
while(!col.empty())
{
node temp=col.front();
col.pop_front();
int q=temp.n;
if(q==b)
{
printf("%d\n",temp.c);
break;
}
index[0]=q/1000;index[1]=(q%1000)/100;index[2]=(q%100)/10;index[3]=q%10;
for(int i=0;i<10;++i) //个位
{
if(i==index[3])
continue;
int l=q+i-index[3];
if(visited[l]==0&&p[l]==1)
{
ans[++j].n=l;ans[j].c=temp.c+1;
visited[l]=1;
col.push_back(ans[j]);
}
}
for(int i=0;i<10;++i) //十位
{
if(i==index[2])
continue;
int l=q+10*(i-index[2]);
if(visited[l]==0&&p[l]==1)
{
ans[++j].n=l;ans[j].c=temp.c+1;
visited[l]=1;
col.push_back(ans[j]);
}
}
for(int i=0;i<10;++i) //百位
{
if(i==index[1])
continue;
int l=q+100*(i-index[1]);
if(visited[l]==0&&p[l]==1)
{
ans[++j].n=l;ans[j].c=temp.c+1;
visited[l]=1;
col.push_back(ans[j]);
}
}
for(int i=1;i<10;++i) //千位
{
if(i==index[0])
continue;
int l=q+1000*(i-index[0]);
if(visited[l]==0&&p[l]==1)
{
ans[++j].n=l;ans[j].c=temp.c+1;
visited[l]=1;
col.push_back(ans[j]);
}
}
}
}
return 0;
}