1. 程式人生 > >POJ 3126 Prime Path

POJ 3126 Prime Path

ble pop rip tor 一次 門牌號 下一個 入隊 oid

題目鏈接: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