bfs这个题目就麻烦在数字是按位变化的,所以要把数字拆开……
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
const int M=10005;
int pri[M];
int prim[11][10][10][10]; //拆开的素数
int isu[M];
queue<int>re;
void bfs(int n,int tn)
{
while(!re.empty())
re.pop();
re.push(n);
isu[n]=1;
while(!re.empty())
{
int t=re.front();
re.pop();
int tmp=t; //拆数字
int tmp1=tmp%10;tmp/=10;
int tmp2=tmp%10;tmp/=10;
int tmp3=tmp%10;tmp/=10;
int tmp4=tmp%10;
for(int i=1;i<10;i+=2) //个位,偶数不是素数
{
int an=tmp4*1000+tmp3*100+tmp2*10+i;
if(i!=tmp1&&!isu[an]&&prim[tmp4][tmp3][tmp2][i])
{
isu[an]=isu[t]+1;
re.push(an);
if(an==tn)
return;
}
}
for(int i=0;i<10;i++) //十位
{
int an=tmp4*1000+tmp3*100+i*10+tmp1;
if(i!=tmp2&&!isu[an]&&prim[tmp4][tmp3][i][tmp1])
{
isu[an]=isu[t]+1;
re.push(an);
if(an==tn)
return;
}
}
for(int i=0;i<10;i++) //百位
{
int an=tmp4*1000+i*100+tmp2*10+tmp1;
if(i!=tmp3&&!isu[an]&&prim[tmp4][i][tmp2][tmp1])
{
isu[an]=isu[t]+1;
re.push(an);
if(an==tn)
return;
}
}
for(int i=1;i<10;i++) //千位,不能为0
{
int an=i*1000+tmp3*100+tmp2*10+tmp1;
if(i!=tmp1&&!isu[an]&&prim[i][tmp3][tmp2][tmp1])
{
isu[an]=isu[t]+1;
re.push(an);
if(an==tn)
return;
}
}
}
}
void clearu()
{
for(int i=1000;i<M;i++)
isu[i]=0;
}
int main()
{
for(int i=2;i<M;i++) //求素数表
{
if(!pri[i])
{
for(int j=i*i;j<M;j+=i)
pri[j]=1;
}
}
for(int i=1000;i<M;i++)
{
if(!pri[i])
{
int tmp=i;
int tmp1=tmp%10;tmp/=10;
int tmp2=tmp%10;tmp/=10;
int tmp3=tmp%10;tmp/=10;
int tmp4=tmp%10;
prim[tmp4][tmp3][tmp2][tmp1]=1;
}
}
int t;
int n,tn;
scanf("%d",&t);
while (t--)
{
clearu();
scanf("%d%d",&n,&tn);
bfs(n,tn);
if(n==tn)
{
printf("0\n");
continue;
}
if(isu[tn])
printf("%d\n",isu[tn]-1); //第一次不算
else
printf("Impossible");
}
return 0;
}