POJ 3126 Prime Path
題目鏈接:POJ 3126
Description
首相們對安全局長帶來的消息感到非常不安,他們說他們將為了安全考慮改變首相房間門牌號上面的門牌號碼。
——要不時地改變門牌號,這樣可以使敵人處於迷惑之中。
——但是,我現在的門牌號是1033號,它是一個質數,我有質數強迫癥。我不能忍受我的門牌號不是質數。
——我知道,所以你的新門牌號8179號也是一個質數。你只需在你辦公室的門上更換掉原來的四個數字就可以。
——不,不是那麽簡單。假設我把第一個數字先改為8,那麽在你更改下一個數字之前他將是8033,它不是素數!
——我明白了,首相,即使在幾秒鐘內,你也不能忍受一個非質數。
——是的!因此,你必須提出一種從1033改為8179而且中間全是質數的方案,每次只可以改變其中一個數位上的數字。
例如:
1033
1733
3733
3739
3779
8779
8179
此時,我們一共更改了6次數字,已知更改一次數字需要花費1英鎊,因此我們需要花費6英鎊。
你的任務就是寫一個程序,對於任意的起始和終止數字,都求出最小花費。
Input
輸入數據有多組,首先是一個數字n,代表之後有n組數據。
其次,在每一組輸入中,都包含兩個數字m和n,m代表原來的門牌號,n代表現在的門牌號。
其中,m和n都是四位數,而且不含前導0。
Output
每組輸入輸出一行,輸出在此情況下的最小花費。若不存在從m到n的路徑,則輸出單詞“Impossible”。
Sample Input
3
1033 8179
1373 8017
1033 1033
Sample Output
6
7
0
題意
兩個4位素數,並且千位不可能是0,每次只能改變一個位上的數,並且改完之後還是素數,用這樣的素數轉換,問最少要幾次轉換得到目標素數,如果不能得到輸出不能。
題解:
BFS,先打一個表把1000到10000的素數打出來,然後從起點開始改變每個位上的數,如果是素數,就入隊記錄這個數用了幾步素數轉換得來,直至把能達到的所有素數需要的最好步數得出或得出答案。
代碼
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<cstring> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int N = 2e5 + 5; set<int>Prime; set<int>state; void Init() { int flag; for (int i(1000); i < 10000; i++) { flag = 0; for (int j(2); j <= int(sqrt(i*1.0)); j++) if (i%j == 0) { flag = 1; break; } if (!flag) Prime.insert(i); } } int ans; int f(string a) { return (a[0] - ‘0‘) * 1000 + (a[1] - ‘0‘) * 100 + (a[2] - ‘0‘) * 10 + (a[3] - ‘0‘); } map<string, int>dis; int bfs(string a, string b) { queue<string>P; P.push(a); state.insert(f(a)); string temp; while (!P.empty()) { temp = P.front(); P.pop(); if (temp == b) return dis[temp]; int ans = 1; for (int i(0); i < 4; i++) { string next = temp; for (int j(0); j < 10; j++) { if (i == 0 && j == 0)continue; next[i] = j + ‘0‘; if (state.find(f(next)) != state.end())continue; if (Prime.find(f(next)) != Prime.end()) { P.push(next); dis[next] = dis[temp] + 1; state.insert(f(next)); } } } } return -1; } int main() { Init(); int T; cin >> T; string a, b; for (int i(0); i < T; i++) { state.clear(); dis.clear(); ans = 1000000; cin >> a >> b; cout << bfs(a, b) << endl; } return 0; }
POJ 3126 Prime Path