#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
#define CLR(arr, val) memset(arr, val, sizeof(arr))
const int LEN=10010;
int prime[LEN], isqueue[LEN], steps[LEN];
int g, s, b, q;
void init()
{
for(int i=2, j; i*i<=LEN; i++)
{
if( !prime[i] )
for(j=i*i; j<=LEN; j+=i)
prime[j]=1;
}
}
inline void fun(int n)
{
q=n/1000;
b=n%1000/100;
s=n%100/10;
g=n%10;
}
inline int funa(int a, int b, int c, int d)
{
return a*1000+b*100+c*10+d;
}
void BFS(int pa, int pb)
{
queue<int> qq;
qq.push(pa);
isqueue[pa]=1;
steps[pa]=0;
int i, j, x, y;
while( 1 )
{
x=qq.front();
qq.pop();
if( x==pb ) break;
fun(x);
for(i=1; i<10; i++)
{
y=funa(i, b, s, g);
if( !prime[y] && !isqueue[y] )
{
qq.push(y);
isqueue[y]=1;
steps[y]=steps[x]+1;
}
}
for(i=0; i<10; i++)
{
y=funa(q, i, s, g);
if( !prime[y] && !isqueue[y] )
{
qq.push(y);
isqueue[y]=1;
steps[y]=steps[x]+1;
}
}
for(i=0; i<10; i++)
{
y=funa(q, b, i, g);
if( !prime[y] && !isqueue[y] )
{
qq.push(y);
isqueue[y]=1;
steps[y]=steps[x]+1;
}
}
for(i=0; i<10; i++)
{
y=funa(q, b, s, i);
if( !prime[y] && !isqueue[y] )
{
qq.push(y);
isqueue[y]=1;
steps[y]=steps[x]+1;
}
}
}
}
int main()
{
init();
int T, pa, pb;
cin >> T;
while( T-- )
{
cin >> pa >> pb;
if( pa==pb )
{
cout << 0 << endl;
continue;
}
CLR(isqueue, 0);
CLR(steps, 0);
BFS(pa, pb);
cout << steps[pb] << endl;
}
return 0;
}
poj3126求一个素数到另一个素数每次变化一个数字的变化次数
最新推荐文章于 2021-05-18 00:36:46 发布