题意:从一个四位质数到另一个四位质数,每次只能改变一位的数字并且改变后的数字也是质数,数字不可以重复,为多少步。
思路:入口为 40 的 BFS,剪枝如下:千位没有 0,个位偶数的都不是质数。
#include<iostream>
#include<cmath>
#include<queue>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int a, b;
bool vis[10005];
struct point{
int n;
int cnt; //步数
};
bool judge(int x){ //是否为质数
for(int i = 2; i <= sqrt(x); i++)
if(x%i == 0)
return 0;
return 1;
}
void bfs(){
queue<point> q;
point p1, p2;
p1.cnt = 0;
p1.n = a;
vis[a] = 1;
q.push(p1);
while(!q.empty()){
p1 = q.front();
if(p1.n == b){
cout << p1.cnt << endl;
return;
}
q.pop();
int ge = p1.n%10; //个位
int shi = (p1.n/10)%10; //十位
int bai = (p1.n/100)%10; //百位
int qian = p1.n/1000; //千位
for(int i = 1; i < 10; i+=2){
int w = p1.n-ge+i;
if(w != p1.n && !vis[w] && judge(w)){
vis[w] = 1;
p2.n = w;
p2.cnt = p1.cnt+1;
q.push(p2);
}
}
for(int i = 0; i < 10; i++){
int w = p1.n-shi*10+i*10;
if(w != p1.n && !vis[w] && judge(w)){
vis[w] = 1;
p2.n = w;
p2.cnt = p1.cnt+1;
q.push(p2);
}
}
for(int i = 0; i < 10; i++){
int w = p1.n-bai*100+i*100;
if(w != p1.n && !vis[w] && judge(w)){
vis[w] = 1;
p2.n = w;
p2.cnt = p1.cnt+1;
q.push(p2);
}
}
for(int i = 1; i < 10; i++){
int w = p1.n-qian*1000+i*1000;
if(w != p1.n && !vis[w] && judge(w)){
vis[w] = 1;
p2.n = w;
p2.cnt = p1.cnt+1;
q.push(p2);
}
}
}
cout << "Impossible" << endl;
return;
}
int main(){
//freopen("a.txt", "r", stdin);
int num; cin >> num;
while(num--){
scanf("%d %d", &a, &b);
memset(vis, 0, sizeof(vis));
bfs();
}
return 0;
}