UVA 12101 Prime Path (素数筛+BFS)

题意:给一个四位数的素数,求通过几步变换(一次只能换一个位置的数,且变换过程中只能出现素数)变为目标四位数

分析:素数筛法+BFS,BFS时更换一个数字如果符合条件就加入队列

代码:
 

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))

using namespace std;

typedef pair <int,int> pii;
const int maxn = 10000 + 5 , inf = 0x3f3f3f3f;
bool vis[maxn];
void isPrime(){
    memset(vis,true,sizeof(vis));
    vis[1]=false;
    vis[2]=true;
    for(int i=2;i<=maxn;i++){
        for(int j=i*2;j<=maxn;j+=i){
            vis[j]=false;
        }
    }
}
struct node{
    int x,d;
    node(int xx,int dd):x(xx),d(dd){};
};
bool done[maxn];
int Start,End;
int bfs(int d){
    mem(done);
    queue<node>q;
    while(!q.empty())q.pop();
    q.push(node(Start,d));
    while(!q.empty()){
        node now = q.front();q.pop();
        if(now.x==End) return now.d;
        else{
            for(int i=1;i<=9;i+=2){
                int temp = now.x/10*10+i;
                if(vis[temp]&&temp!=now.x&&!done[temp]){
                    done[temp]=true;
                    q.push(node(temp,now.d+1));
                }
            }
            for(int i=0;i<=9;i++){
                int nn = now.x%10;
                int temp = now.x/100*100+i*10+nn;
                if(vis[temp]&&temp!=now.x&&!done[temp]){
                    done[temp]=true;
                    q.push(node(temp,now.d+1));
                }
            }
            for(int i=0;i<=9;i++){
                int nn = now.x%100;
                int temp = now.x/1000*1000+i*100+nn;
                if(vis[temp]&&temp!=now.x&&!done[temp]){
                    done[temp]=true;
                    q.push(node(temp,now.d+1));
                }
            }
            for(int i=1;i<=9;i++){
                int nn = now.x%1000;
                int temp = i*1000+nn;
                if(vis[temp]&&temp!=now.x&&!done[temp]){
                    done[temp]=true;
                    q.push(node(temp,now.d+1));
                }
            }
        }
    }
    return -1;
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T;
    scanf("%d",&T);
    isPrime();
    while(T--){
        cin>>Start>>End;
        int ans = bfs(0);
        if(ans==-1) cout<<"Impossible"<<endl;
        else cout<<ans<<endl;
    }
}

 

posted @ 2018-07-25 15:03  dslybyme7  阅读(102)  评论(0编辑  收藏  举报