BFS+剪枝
#include <stdio.h>
#include <memory.h>
int prime[10000];
int st,fin;
void Prime()
{
int i,j;
for(i=2;i<10000;i++)
{
if(!prime[i])
{
for( j=i+i;j<10000;j+=i)
{
prime[j]=1;
}
}
}
}
int getvalue(int a[])
{
int m=0;
for(int i=3;i>=0;i--)
{
m=m*10+a[i];
}
return m;
}
int bfs(int st,int fin)
{
int visit[10000]={0};
int q[10000];
int dis[10000]={0};
int font=0;
int rear=0;
q[rear++]=st;
dis[font]=0;
while(font<rear)
{
int w=q[font];
int m=w;
if(w==fin) return dis[w];
int num[4];
int i;
for(i=0;i<4;i++)
{
num[i]=w%10;
w=w/10;
}
for(i=0;i<4;i++)
{
int j;
if(i==3) j=1;
else j=0;
int a=num[i];
for(;j<=9;j++)
{
if(j!=a){
num[i]=j;
int tem=getvalue(num);
if(!prime[tem]&&!visit[tem])
{
dis[tem]=dis[m
]+1;
visit[tem]=1;
q[rear++]=tem;
}
}
num[i]=a;
}
}
font++;
}
}
int main()
{
memset(prime,0,sizeof(prime));
Prime();
int N;
scanf("%d",&N);
while(N--)
{
scanf("%d %d",&st,&fin);
printf("%d\n",bfs(st,fin));
}
return 0;
}