POJ(3126)(Prime Path)

链接:https://vjudge.net/problem/POJ-3126#author=0

思路:一道埃氏筛法 + bfs的题目,因为要测试多个数据所以可以先打印一张五位数内的质数表,然后bfs从起点开始搜索,每次变化一位,然后判断条件并确定是否放入队列,dp数组记录距离(即花费)。

代码:

#include
#include
#include
using namespace std;

const int maxn = 10000;

bool isprime[maxn+1];
int prime[maxn+1];
int dp[maxn+1];

int getnext(int num,int t,int change){
    if(t==0)return num/10*10+change;
    else if(t==1)return num/100*100+num%10+change*10;
    else if(t==2)return num/1000*1000+num%100+change*100;
    else return num%1000+change*1000;
}

int main(){
//打表
    int p = 0;
    for(int i=0;i<=maxn;i++)isprime[i] = true;
    isprime[0] = isprime[1] = false;
    for(int i=2;i<=maxn;i++){
        if(isprime[i]){
        prime[p++] = i;
            for(int j=2*i;j<=maxn;j+=i){
                isprime[j] = false;
            }
        }
    }

    int n;
    cin>>n;

    while(n--){
        int a,b;
        cin>>a>>b;
        memset(dp,0x3f,sizeof(dp));
        dp[a] = 0;
//bfs
        queue q;
        q.push(a);
        while(!q.empty()){
            int cur = q.front();
            q.pop();
            for(int i=0;i<4;i++){
                for(int j=0;j<10;j++){
                    if(i==3&&j==0)continue;
                    int next = getnext(cur,i,j);
                    if(isprime[next]==false||dp[next]<=dp[cur])continue;
                    dp[next]  = dp[cur] + 1;
                    q.push(next);
                }
            }
        }
        cout<

你可能感兴趣的:(POJ(3126)(Prime Path))