poj 3126
基本上可以说是做的第一道bfs题,稍微有点感觉了
//============================================================================
// Name : 3126.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int ans[10000];
queue <int> q;
bool visit[10000], prime[10000];
int N, a, b;
int bfs(int m, int n){
while(!q.empty()) q.pop();
memset(ans, 0, sizeof(ans));
q.push(m);
visit[m] = true;
int p;
if(visit[n]) return ans[n];
while(!q.empty()){
p = q.front();
q.pop();
for(int i = 0;i <= 9;i++){
if(prime[p/10*10 + i]&&!visit[p/10*10 + i]){
q.push(p/10*10 + i);
ans[p/10*10 + i] = ans[p]+1;
visit[p/10*10 + i] = true;
}
if(prime[p/100*100+p%10+i*10]&&!visit[p/100*100+p%10+i*10]){
q.push(p/100*100+p%10+i*10);
ans[p/100*100+p%10+i*10] = ans[p]+1;
visit[p/100*100+p%10+i*10] = true;
}
if(prime[p/1000*1000+p%100+i*100]&&!visit[p/1000*1000+p%100+i*100]){
q.push(p/1000*1000+p%100+i*100);
ans[p/1000*1000+p%100+i*100] = ans[p]+1;;
visit[p/1000*1000+p%100+i*100] = true;
}
if(i!=0&&prime[p%1000+i*1000]&&!visit[p%1000+i*1000]){
q.push(p%1000+i*1000);
ans[p%1000+i*1000] = ans[p]+1;
visit[p%1000+i*1000] = true;
}
}
if(visit[n]){
return ans[n];
}
}
}
int main() {
freopen("a.txt", "r", stdin);
memset(prime, true, sizeof(prime));
prime[1] = false;
for(int i = 2;i <= 9999/2;i++){
if(prime[i]){
for(int j = i<<1;j <= 9999;j+=i){
prime[j] = false;
}
}
}
scanf("%d", &N);
while(N--){
scanf("%d%d",&a, &b);
memset(visit, false, sizeof(visit));
printf("%d\n", bfs(a, b));
}
return 0;
}

浙公网安备 33010602011771号