Prime Path
题意:给出2个素数(4位的数字)A和B,要求从A每次边一个位置上的数字且是素数,通过几次变换后,求变到B的最少步数,当然是bfs
思路:一 一改变位置上的数并判断素数;
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<climits>
#include<algorithm>
using namespace std;
typedef long long ll;
int n1,n2;
int step[10000];
int is_prime(int x)
{
if(x==2||x==3) return 1;
if(x%6!=1&&x%6!=5) return 0;
for(int i=5;i*i<=x;i=i+6){
if(x%i==0||x%(i+2)==0) return 0;
}
return 1;
}
void bfs()
{
memset(step,-1,sizeof(step));
queue<int> q;
q.push(n1);
step[n1]=0;
while(!q.empty()){
int t=q.front();
q.pop();
if(t==n2){
printf("%d\n",step[n2]);
return ;
}
for(int i=0;i<=9;i++){//每个位置上的数值枚举0-9
//ABCD
int num1 = (t / 10) * 10 + i;//改变第1个值,D;
if(step[num1]==-1&&is_prime(num1)) {//没有被访问过,并且是素数才进队
q.push(num1);
step[num1]=step[t]+1;//是上一个素数+1的步数走来的;
}
int num2 = (t % 10 + t / 100 * 100 + i * 10); //改变第2个值,C;
if(step[num2]==-1&&is_prime(num2)){
q.push(num2);
step[num2]=step[t]+1;
}
int num3 = (t % 100 + t/ 1000 * 1000 + i * 100);//改变第3个值,B;
if(step[num3]==-1&&is_prime(num3)){
q.push(num3);
step[num3]=step[t]+1;
}
if(i!=0){//保持4位数
int num4 = (t % 1000 + i * 1000);//改变第4个值,A;
if(step[num4]==-1&&is_prime(num4)){
q.push(num4);
step[num4]=step[t]+1;
}
}
}
}
}
int main()
{
int T;
while(cin>>T){
while(T--){
scanf("%d%d",&n1,&n2);
bfs();
}
}
}