POJ 3126 Prime Path

解题思路:

1)首先计算0-9999之间的素数

2)BFS,每次更改4位数字中的一位数字(首位数字不能为0),判断是否为素数,是且未被访问过的加入到队列里面

3)队列为空,或者发现目的素数,停止

NULL
#include <iostream>
using namespace std;
#define MAXN 10000
int main()
{
int i,j,k,l,n,p,q,s,e,iter,ts,num,radix,qu[MAXN],d[4];
bool IsPrime[MAXN],visit[MAXN];
memset(IsPrime,
1, sizeof(IsPrime));
IsPrime[
0]=IsPrime[1]=false;
for(i=2;i<5001;i++)
if(IsPrime[i])for(j=i*2;j<MAXN;j+=i)IsPrime[j]=false;
scanf(
"%d", &n);
while (n--)
{
scanf(
"%d %d", &p, &q);
memset(visit,
0, sizeof(visit));
qu[
0]=p,iter=s=e=0,visit[p]=true;
while (s<=e && !visit[q])
{
for(ts=e,i=s;i<=e&&!visit[q];i++)
{
for(num=qu[i],j=3,radix=1000;j>=0;j--)d[j]=num/radix,num-=d[j]*radix,radix/=10;
for(j=0;j<4;j++)
for(k=0;k<10;k++)
{
if(j==3&&k==0)continue;
for(radix=1,num=l=0;l<4;radix*=10,l++)
if(l==j)num+=k*radix;else num+=d[l]*radix;
if(!visit[num] && IsPrime[num])qu[++ts]=num, visit[num]=true;
}
}
s
=e+1,e=ts,iter++;
}
visit[q]
?printf("%d\n", iter):printf("Impossible\n");
}
return 0;
}

 

posted on 2010-12-17 22:01  ltang  阅读(231)  评论(0编辑  收藏  举报

导航