解题思路:
1)首先计算0-9999之间的素数
2)BFS,每次更改4位数字中的一位数字(首位数字不能为0),判断是否为素数,是且未被访问过的加入到队列里面
3)队列为空,或者发现目的素数,停止
#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 ;
}