题目:http://poj.org/problem?id=3126
大意:给出两个素数,至少求出要经过多少步能够由A变成B,否则输出:Impossible.
要求最少的步骤,联想到用BFS。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
bool vis[10005];
int number1,number2;
typedef struct node{
int num,step;
}Node;
bool judge(int num){
if(num==0||num==1)return 0;
for(int i=2;i*i<=num;i++){
if(num%i==0)return 0;
}
return true;
}
void bfs(){
queue<Node> que;
Node temp;
temp.num=number1;
temp.step=0;
que.push(temp);
vis[number1]=1;
while(!que.empty()){
temp=que.front();
que.pop();
if(temp.num==number2){
printf("%d\n",temp.step);
return ;
}
for(int i=1;i<=9;i++){ //千位
int q=temp.num;
q=i*1000+q%1000;
if(q!=temp.num&&vis[q]==0&&judge(q)){
vis[q]=1;
Node tep;
tep.num=q;
tep.step=temp.step+1;
que.push(tep);
}
}
for(int i=0;i<=9;i++){ //百位
int q=temp.num;
q=q%100+q/1000*1000+i*100;
if(q!=temp.num&&vis[q]==0&&judge(q)){
vis[q]=1;
Node tep;
tep.num=q;
tep.step=temp.step+1;
que.push(tep);
}
}
for(int i=0;i<=9;i++){ //十位
int q=temp.num;
q=q%10+q/100*100+i*10;
if(q!=temp.num&&vis[q]==0&&judge(q)){
vis[q]=1;
Node tep;
tep.num=q;
tep.step=temp.step+1;
que.push(tep);
}
}
for(int i=1;i<=9;i+=2){ //个位
int q=temp.num;
q=q/10*10+i;
if(q!=temp.num&&vis[q]==0&&judge(q)){
vis[q]=1;
Node tep;
tep.num=q;
tep.step=temp.step+1;
que.push(tep);
}
}
}
printf("Impossible.\n");
}
int main()
{
//freopen("cin.txt","r",stdin);
int t;
cin>>t;
while(t--){
scanf("%d%d",&number1,&number2);
memset(vis,0,sizeof(vis)); //再一次地犯错,初始化啊!
bfs();
}
return 0;
}