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;
}

  

posted on 2011-07-22 20:16  sysu_mjc  阅读(147)  评论(0编辑  收藏  举报

导航