POJ3126--Prime Path(BFS)

题目大意:给定两个四位的素数a,b,要求把a变换到b。变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数前一步得到的素数只能有一个位不同,而且每步得到的素数都不能重复。求从ab最少需要的变换次数。无法变换则输出Impossible


分析:BFS。用埃氏筛选法,预处理出10000以内的素数,作为剪枝。


代码:

#include <cstdio>
#include <cstring>
#include <queue>
#include <math.h>
using namespace std;

#define maxn 10000
struct Node {
    int x, ans;
    Node(int x, int ans):x(x), ans(ans){}
};
queue<Node> q;
int n, m, flag;
int vis[maxn];
int pri[maxn];

void prime() {
    int m = sqrt(10000+0.5);
    for(int i = 2; i < m; i++) if(!pri[i])
        for(int j = i*i; j <= 10000; j+=i) pri[j] = 1;
}


void bfs() {
    q.push(Node(n,0));
    vis[n] = 1;
    while(!q.empty()) {
        Node s = q.front();
        if(s.x == m) {
            printf("%d\n", s.ans);
            flag = 1;
            return;
        }
        for(int i = 1; i < 10; i++) {
            int y = s.x % 1000 + i *1000;
            if(!vis[y] && !pri[y]) {
                vis[y] = 1;
                q.push(Node(y, s.ans+1));
            }
        }
        for(int i = 0; i < 10; i++) {
            int y = s.x % 100 + i * 100 + s.x / 1000 *1000;
            if(!vis[y] && !pri[y]) {
                vis[y] = 1;
                q.push(Node(y, s.ans+1));
            }
        }
        for(int i = 0; i < 10; i++) {
            int y = s.x % 10 + i *10 + s.x / 100 * 100;
            if(!vis[y] && !pri[y]) {
                vis[y] = 1;
                q.push(Node(y, s.ans+1));
            }
        }
        for(int i = 1; i < 10; i += 2) {
            int y = s.x - s.x % 10 + i;
            if(!vis[y] && !pri[y]) {
                vis[y] = 1;
                q.push(Node(y, s.ans+1));
            }
        }
        q.pop();
    }
    return;
}

int main()
{
    int kase;
    scanf("%d", &kase);
    memset(pri, 0, sizeof(pri));
    prime();
    while(kase--) {
        flag = 0;
        while(!q.empty()) q.pop();
        scanf("%d%d", &n, &m);
        memset(vis, 0, sizeof(vis));
        bfs();
        if(!flag) printf("Impossible\n");
    }
    return 0;
}


你可能感兴趣的:(POJ3126--Prime Path(BFS))