#include<stdio.h>
#include<string.h>

int n1, n2;  
bool prim[10000];  
int value[10000];  
int q[11000];  
int c[4]= {1, 10, 100, 1000};

void prime()
{ int i,j;
  prim[0]=prim[1]=false;
  for(i=2;i<5000;i++)
    if(prim[i]==true){
       for(j=i*2;j<10000;j=j+i)
         prim[j]=false;
       }
}

int BFS()
{int front=0,rear=0,temp,i,digit,j,changed;
 q[rear++]=n1;
 value[n1]=0;
 while(front<rear){
   temp=q[front++];
   if(temp==n2)
      return 1;
   for(i=0;i<4;i++){
     digit=(temp/c[i])%10;
     for(j=0;j<10;j++){
     changed=temp-digit*c[i]+j*c[i]; 
       if(value[changed]==-1&&prim[changed]&&changed>=1000&&j!=digit){
           q[rear++]=changed;
           value[changed]=value[temp]+1;
         }
       }
    }
  }
 return 0;
}

int main()
{ int k;
  memset(prim,true,sizeof(prim));
  scanf("%d",&k);
  prime();
  while(k--){
     scanf("%d%d",&n1,&n2);
     memset(value,-1,sizeof(value));
     if(prim[n1]&&prim[n2]){
         if(BFS()==1)
           printf("%d\n",value[n2]);
         else
           printf("Impossible\n");
         }
      else
          printf("Impossible\n");
    }
 return 0;
}  



学习了一个简单的BFS。。至于BFS是什么,广度优先遍历。。。。。广度是什么的呢,应该就是范围的吧,把所有可能的情况搜索出来的,那不是和暴搜一样的了?
先做题,再总结的吧。