还是宽搜
题目大意:给你两个素数,从第一个素数变到第二个素数,每次只能变一位, 保证变化过程所有出现的数都是素数
求最少变化次数
直接上代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
const int maxn = 100000 + 10;
using namespace std;
int a,b;
bool prime(int n){
if(n==0||n==1)return false;
if(n==2||n==3)return true;
for(int i=2;i*i<=n;i++)
if(n%i==0)return false;
return true;
}
int vis[maxn];
int bfs(){
memset(vis,-1,sizeof(vis));
queue<int>q;
q.push(a);
vis[a]=0;
while(!q.empty()){
int t=q.front();
if(t==b)return vis[b];
q.pop();
for(int i=0;i<4;i++){
if(i==0){
for(int i=1;i<=9;i+=2){
int num=t-t%10+i;
if(prime(num)&&vis[num]==-1){
vis[num]=vis[t]+1;
q.push(num);
}
}
}
if(i==1){
for(int i=0;i<=9;i++){
int num=t-t%100+t%10+i*10;
if(prime(num)&&vis[num]==-1){
vis[num]=vis[t]+1;
q.push(num);
}
}
}
if(i==2){
for(int i=0;i<=9;i++){
int num=t-t%1000+t%100+i*100;
if(prime(num)&&vis[num]==-1){
vis[num]=vis[t]+1;
q.push(num);
}
}
}
if(i==3){
for(int i=1;i<=9;i++){
int num=t-(t/1000)*1000+i*1000;
if(prime(num)&&vis[num]==-1){
vis[num]=vis[t]+1;
q.push(num);
}
}
}
}
}
return -1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
int re=bfs();
if(re==-1)printf("Impossible\n");
else printf("%d\n",re);
}
return 0;
}