题目:http://poj.org/problem?id=3126
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0xfffffff
#define MAXN 100005
using namespace std;
int s,e;
bool vis[10005];
int dist[10005];
bool isPrime(int x) {
if (x <= 1)return false;
for (int i = 2; i*i < x + 1; i++)if (x%i == 0)return false;
return true;
}
void bfs() {
queue<int> q;
memset(vis, false, sizeof(vis));
dist[s] = 0;
vis[s] = true;
q.push(s);
int node;
int tmp;
while (!q.empty()) {
node = q.front();
q.pop();
for(int i = 1; i < 10; i++){
tmp = node;
tmp = tmp%1000 + i*1000;
if (vis[tmp]==false&&isPrime(tmp)) {
dist[tmp] = dist[node]+1;
if(e==tmp)return;
q.push(tmp);
vis[tmp] = true;
}
}
for(int i = 0; i < 10; i++){
tmp = node;
tmp = (tmp/1000)*1000 + i*100 + tmp%100;
if (vis[tmp]==false&&isPrime(tmp)) {
dist[tmp] = dist[node]+1;
if(e==tmp)return;
q.push(tmp);
vis[tmp] = true;
}
}
for(int i = 0; i < 10; i++){
tmp = node;
tmp = (tmp/100)*100 + i*10 + tmp%10;
if (vis[tmp]==false&&isPrime(tmp)) {
dist[tmp] = dist[node]+1;
if(e==tmp)return;
q.push(tmp);
vis[tmp] = true;
}
}
for(int i = 0; i < 10; i++){
tmp = node;
tmp = (tmp/10)*10 + i;
if (vis[tmp]==false&&isPrime(tmp)) {
dist[tmp] = dist[node]+1;
if(e==tmp)return;
q.push(tmp);
vis[tmp] = true;
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>s>>e;
bfs();
cout<<dist[e]<<endl;
}
}
总结: 水题.