POJ 3126 Prime Path 快速篩法 bfs

/*
 * 思路:
 *      素數好辦,套個快速篩法就能得到1到10000的素數情況。對於bfs,每次枚舉當前數的每一位,再枚舉這位的取值情況。
 *      就是下面的兩重for。好像也沒啥說的=.=,基本都是bfs的套路。
 */

#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
const ll N = 1e4 + 10;

ll s, e;
ll num_prime;
ll visit[N], judge[N];
ll prime[N];
struct point{
    ll x;
    ll step;
}p1, p2;
queue<point> Q;

inline void init(){
    judge[0] = judge[1] = 1;
    for(ll i = 2; i < N; ++i){
        if(judge[i] == 0)prime[num_prime++] = i;
        for(ll j = 0; j < num_prime && i * prime[j] < N; ++j){
            judge[i * prime[j]] = 1;
            if(i % prime[j] == 0)break;
        }
    }
}

inline void bfs(){
    memset(visit, 0, sizeof(visit));
    while(!Q.empty())Q.pop();

    p1.x = s, p1.step = 0;
    Q.push(p1);
    visit[s] = 1;

    while(!Q.empty()){
        p1 = Q.front();
        Q.pop();
        if(p1.x == e){
            printf("%lld\n", p1.step);
            return ;
        }
        for(ll i = 0; i < 4; ++i){
            for(ll j = 0; j <= 9; ++j){
                ll cur = p1.x;
                if(i == 0){
                    ll iBase = cur % 10;
                    cur = cur - iBase + j;
                }
                if(i == 1){
                    ll iBase = (cur / 10) % 10;
                    cur = cur - iBase * 10 + j * 10;
                }
                if(i == 2){
                    ll iBase = (cur / 100) % 10;
                    cur = cur - iBase * 100 + j * 100;
                }
                if(i == 3){
                    ll iBase = cur / 1000;
                    cur = cur - iBase * 1000 + j * 1000;
                }
                if(visit[cur] == 0 && cur >= 1000 && judge[cur] == 0){
                    p2.x = cur, p2.step = p1.step + 1;
                    visit[cur] = 1;
                    Q.push(p2);
                }
            }
        }
    }

    printf("Impossible\n");
}

int main(){
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);

    ll t;
    init();
    scanf("%lld", &t);
    while(t--){
        scanf("%lld%lld", &s, &e);

        bfs();
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章