#include <stdio.h>
#include <string.h>
int ha[10001];
int p[10001]; //0: 质数 1:合数
int ncase;
int s,e,tmp;
struct queuenode {
int num;
int step;
}queue[100000];
void initprime() { //筛选法构造素数表
memset(p,0,sizeof(p));
p[0]=1;
p[1]=1;
for (int i=2; i<=10000; ++i) {
if(!p[i]) {
for (int j=i*i; j<=10000; j+=i) {
p[j] = 1;
}
}
}
}
int getint (int a, int i, int j) {
if(i==1) return a%1000 + j*1000;
else if(i==2) return a-((a%1000)/100)*100 + j*100;
else if(i==3) return a-((a%100)/10)*10 + j*10;
else return a - a%10 +j;
}
int bfs(int s,int e) {
if(s==e) return 0;
for (int i=0; i<=10000; ++i) ha[i] = 1000000000;
int qhead = 0;
int qtail = 0;
queue[qtail].num = s;
queue[qtail++].step = 0;
while (qhead<qtail) {
for (int i=1; i<=4; ++i) {
for (int j=0; j<=9; ++j) {
if(i==1 && j==0) continue;
tmp = getint(queue[qhead].num,i,j); //将队首元素的第i位变成j
if(tmp == e) return queue[qhead].step + 1;
if(!p[tmp] && queue[qhead].step + 1 < ha[tmp]) {
ha[tmp] = queue[qhead].step + 1;
queue[qtail].num = tmp;
queue[qtail++].step = queue[qhead].step + 1;
}
}
}
++qhead;
}
return -1;
}
int main () {
int res;
initprime();
//for (int i=0; i<10000; ++i) {
// if(!p[i]) printf("%d\n",i);
//}
scanf("%d",&ncase);
while(ncase--) {
scanf("%d%d",&s,&e);
res = bfs(s,e);
if(res==-1) printf("Impossible\n");
else printf("%d\n",res);
}
}
POJ 3126 && HDU 1973 Prime Path (素数表 + BFS)
最新推荐文章于 2021-05-12 17:23:12 发布