广搜水题。。。。。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <cmath>
using namespace std;
int vis[10000];
typedef struct node {
int a[5];
int sum;
}node ;
bool prim[10000];
queue<node>Q;
void inite(){
memset(vis, 0, sizeof vis);
memset(prim, false, sizeof prim);
for(int i=2;i<9999;i++){
int flag =false;
for(int j=2;j<=sqrt(i);j++){
if(i%j==0){
flag=true;
break;
}
}
if(!flag) prim[i]=true;
}
}
int main()
{
int n;
cin>>n;
inite();
while(n--){
memset(vis, 0, sizeof vis);
int x,y;
cin>>x>>y;
while(!Q.empty()) Q.pop();
node now ;
now.a[0]=x/1000;
now.a[1]=x%1000/100;
now.a[2]=x%100/10;
now.a[3]=x%10;
now.sum=x;
Q.push(now);
vis[now.sum]=1;
while(!Q.empty()){
node N=Q.front();
Q.pop();
if(N.sum==y){
cout<<vis[N.sum]-1<<endl;
break;
}
for(int i=0;i<4;i++) //枚举位
for(int j=0;j<=9;j++){ //枚举数
if(i==0&&j==0) continue;
node newnode ;
newnode=N;
newnode.a[i]=j;
newnode.sum=newnode.a[0]*1000+newnode.a[1]*100+newnode.a[2]*10+newnode.a[3]; //计算新点的sum
if(prim[newnode.sum]&&vis[newnode.sum]==0){ //判断是否为素数并且是否访问过
vis[newnode.sum]=vis[N.sum]+1;
Q.push(newnode);
}
}
}
}
}