给两个4位素数(没有前导0)s和t,每次改变一位,改变后必须还是素数,问从s到t最少需要改变几次。
先把所有1000~9999中的素数找出来,然后BFS。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int ans[10010];
bool flag[10010];
inline int _10pown(int n){
if(n==0)return 1;
if(n==1)return 10;
if(n==2)return 100;
if(n==3)return 1000;
return -1;
}
int main(){
for(int i=2;i<=100;i++){
for(int j=i+i;j<=10000;j+=i){
flag[j]=1;
}
}
int t;
cin>>t;
while(t--){
memset(ans,-1,sizeof(ans));
int s,t;
cin>>s>>t;
ans[s]=0;
queue<int> que;
que.push(s);
while(!que.empty()){
int cur=que.front(); que.pop();
int tmp=cur;
int digit[4];
for(int i=0;i<4;i++){
digit[i]=tmp%10;
tmp/=10;
}
for(int k=0;k<4;k++){ //个位到千位
int start=0;
if(k==3)start=1;
for(int i=start;i<10;i++){
int next=cur-digit[k]*_10pown(k);
next+=i*_10pown(k);
if(ans[next]==-1){
if(!flag[next]){
ans[next]=ans[cur]+1;
que.push(next);
}
}
}
}
if(ans[t]!=-1)break;
}
if(ans[t]==-1){
cout<<"Impossible"<<endl;
}else{
cout<<ans[t]<<endl;
}
}
return 0;
}