给定两个四位素数 n,m。
每次能改变 n 中的一个数字,每次改变后的 N 也必须是素数。(首位不能改
成 0)
求最少经过多少次改变能使 n 变成 m,如果无法变成则输出-1。
直接搜索
#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
T RR=1;FF=0;char CH=getchar();
for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
FF*=RR;
}
template<typename T>void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>9)write(x/10);
putchar(x%10+48);
}
bool ss(int x){
for(int i=2;i*i<=x;i++)
if(x%i==0)return false;
return true;
}
int f[100010];
queue<int>q;
queue<int>s;
int main(){
int x,y;
read(x);read(y);
if(x==y){
cout<<0;
return 0;
}
f[x]=1;
q.push(x);
s.push(0);
while(q.size()){
int x=q.front();
int a[5];
a[1]=x/1000%10;
a[2]=x/100%10;
a[3]=x/10%10;
a[4]=x/1%10;
for(int i=1;i<=4;i++){
for(int j=0;j<=9;j++){
int l=a[i];
a[i]=j;
int z=a[1]*1000+a[2]*100+a[3]*10+a[4]*1;
if(!f[z]&&ss(z)&&z>=1000){
f[z]=1;
q.push(z);
s.push(s.front()+1);
if(z==y){
cout<<s.front()+1;
return 0;
}
}a[i]=l;
}
}q.pop();
s.pop();
}cout<<-1<<endl;
return 0;
}