給兩個四位素數 start, end。每步可修改一位數字,修改後必須仍為四位素數(首位不為 0)。求最少步數。多測試案例。不可達輸出 "Impossible"。
#include
#include
#include
using namespace std;
bool isPrime[10000];
int dist[10000];
void sieve() {
memset(isPrime, true, sizeof(isPrime));
isPrime[0] = isPrime[1] = false;
for (int i = 2; i*i < 10000; ++i)
if (isPrime[i])
for (int j = i*i; j < 10000; j += i)
isPrime[j] = false;
}
int bfs(int start, int end) {
memset(dist, -1, sizeof(dist));
queue q;
q.push(start);
dist[start] = 0;
while (!q.empty()) {
int u = q.front(); q.pop();
if (u == end) return dist[u];
char s[5]; sprintf(s, "%04d", u);
for (int pos = 0; pos < 4; ++pos) {
char orig = s[pos];
for (char d = '0'; d <= '9'; ++d) {
if (pos == 0 && d == '0') continue;
if (d == orig) continue;
s[pos] = d;
int v = atoi(s);
if (isPrime[v] && dist[v] == -1) {
dist[v] = dist[u] + 1;
q.push(v);
}
}
s[pos] = orig;
}
}
return -1;
}
int main() {
sieve();
int T; scanf("%d", &T);
while (T--) {
int a, b; scanf("%d%d", &a, &b);
int ans = bfs(a, b);
if (ans == -1) puts("Impossible");
else printf("%d\n", ans);
}
return 0;
}
POJ 3126 是「隱式圖 BFS」的經典例題。預處理素數表,運行時動態生成鄰居,BFS 保證最短路。代碼結構清晰,是圖論 BFS 入門佳作。