题意:
在素数间的bfs
题解:
真的就是简单的bfs,不多说,看代码。
代码:
AC,0ms
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define Maxn 100005
using namespace std;
int p[Maxn]; //0是prime
int f[Maxn];//标记是否已经出现
typedef struct Node{
int key;
int stp;
}Node;
Node st,en;
void prime(){
memset(p,0,sizeof(p));
for(int i=2;i*i<=Maxn;i++)
if(!p[i]){
for(int j=i*i;j<=Maxn;j+=i)
p[j]=1;
}
/*
for(int i=2;i<=Maxn;i++)
if(!p[i]) printf("%d ",i);
puts(""); */
}
int main(int argc, const char * argv[]) {
int T;
int ok;
prime();
scanf("%d",&T);
while(T--){
scanf("%d%d",&st.key,&en.key);
queue<Node >Q;
ok=-1;
memset(f,0,sizeof(f));
st.stp=0;
Q.push(st);
f[st.key]=1;
while(!Q.empty()){
Node cur=Q.front();
Node chg;
int wei;
chg.stp=cur.stp+1;
if(cur.key==en.key)
{
ok=cur.stp;
break;
}
//wei 1st
for(int i=1;i<=9;i++){
wei=cur.key/1000;
chg.key=cur.key+(i-wei)*1000;
if(!p[chg.key] && !f[chg.key]){
f[chg.key]=1;
Q.push(chg);
}
}
//wei 2nd
for(int i=0;i<=9;i++){
wei=cur.key%1000/100;
chg.key=cur.key+(i-wei)*100;
if(!p[chg.key] && !f[chg.key]){
f[chg.key]=1;
Q.push(chg);
}
}
//wei 3rd
for(int i=0;i<=9;i++){
wei=cur.key%100/10;
chg.key=cur.key+(i-wei)*10;
if(!p[chg.key] && !f[chg.key]){
f[chg.key]=1;
Q.push(chg);
}
}
//wei 4rd
for(int i=0;i<=9;i++){
wei=cur.key%10;
chg.key=cur.key+(i-wei)*1;
if(!p[chg.key] && !f[chg.key]){
f[chg.key]=1;
Q.push(chg);
}
}
Q.pop();
}
if(ok==-1) puts("Impossible");
else printf("%d\n",ok);
}
return 0;
}