POJ 3126 Prime Path 广度优先搜索 难度:0

http://poj.org/problem?id=3126

搜索的时候注意

1:首位不能有0

2:可以暂时有没有出现在目标数中的数字

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=1e4+5;
const int inf=0x7fffffff;
bool prim[maxn];
void judge(){
        prim[2]=true;
        for(int i=3;i<maxn;i+=2)prim[i]=true;
        for(int i=3;i<maxn;i+=2){
                if(prim[i]){
                        for(int j=3;j*i<maxn;j+=2){
                                prim[j*i]=false;
                        }
                }
        }
}
int dp[maxn],s,e;
queue<int> que;
const int base[4]={
        10,100,1000,10000
};
int change(int sta,int ind,int num){
        int sub=sta%(base[ind]);
        if(ind>0)sub-=sub%base[ind-1];
        sta-=sub;
        sta+=num*base[ind]/10;
        return sta;
}
void cal(){
        for(int i=0;i<maxn;i++)dp[i]=inf;
        while(!que.empty())que.pop();
        dp[s]=0;
        que.push(s);
        while(!que.empty()){
                int f=que.front();que.pop();
                if(f==e)return ;
                for(int i=0;i<4;i++){
                        for(int j=0;j<10;j++){
                                if(i==3&&j==0)continue;
                                int to=change(f,i,j);
                                if(!prim[to]||dp[to]!=inf)continue;
                                dp[to]=dp[f]+1;
                                que.push(to);
                        }
                }
        }
}
int main(){
        int T;
        scanf("%d",&T);
        judge();
        while(T--){
                scanf("%d%d",&s,&e);
                cal();
                printf("%d
",dp[e]);
        }
}

  

原文地址:https://www.cnblogs.com/xuesu/p/4337980.html