51Nod3016 Prime Path

Problem

阿P给阿K出了一个难题,他给阿K两个素数A,B,保证A,B的位数相同且为4位或5位。

阿K只能对A作一种操作,即将其中一位数字改成另一个数字,要求每次操作后得到的数还是一个素数,问最少多少次可以从A变到B

Solution

按每一位bfs

Code

#include<stdio.h>
#include<set>
#include<iostream>
#include<stack>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
typedef long long ll;
typedef long double ld;
typedef double db;
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int mod=998244353;
ll mo(ll a,ll p){
    return a>=p?a%p:a;
}
inline int rd() {
    int x = 0, f = 1;
    char ch;
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return f * x;
}
inline ll gcd(ll x, ll y){
    return y==0?x:gcd(y,x%y);
}
inline ll speed(ll a,ll b){
    ll cur=a,anss=1;
    while(b){
        if(b&1) anss=anss*cur;
        cur=cur*cur;
        b>>=1;
    }
    return anss;
}
const int MAXN=1e5;
bool ipr[MAXN+20];
int cnt,pri[MAXN/5];
void prime(){//埃式筛法
    int N=sqrt(MAXN)+0.5,mul;
    memset(ipr,true,sizeof(ipr));
    ipr[1]=false;
    for(int i=2;i<=N;i++){
        if(ipr[i]==true){
            i==2?mul=1:mul=2;
            for(int j=i*i;j<=MAXN;j+=i*mul){
                ipr[j]=false;
            }
        }
    }
    for(int i=2;i<=MAXN;i++){
        if(ipr[i]==true){
            pri[++cnt]=i;
        }
    }
}
int T,a,b;
int wei(int x){
    int ret=0;
    do{
        x/=10;
        ret++;
    }while(x);
    return ret;
}
struct E{
    int num,cnt;
};
bool f[100020];
int bits[10];
int comb(int t){
    int ret=0;
    for(int i=t;i>=1;i--){
        ret*=10;
        ret+=bits[i];
    }
    return ret;
}
int bfs(){
    int t=wei(a);
    queue<E>q;
    q.push((E){a,0});
    f[a]=true;
    while(!q.empty()){
        E cur=q.front();q.pop();
        if(cur.num==b) return cur.cnt;
        for(int i=1;i<=t;i++){
            bits[i]=cur.num%10;
            cur.num/=10;
        }
        //cout<<comb(t)<<endl;
        for(int i=1;i<=t;i++){
            int d=bits[i];
            for(int j=0;j<=9;j++){
                if(j==d||(i==t&&j==0)) continue;
                bits[i]=j;
                int nex=comb(t);
                //cout<<nex<<endl;
                if(ipr[nex]&&!f[nex]){
                    f[nex]=true;
                    q.push((E){nex,cur.cnt+1});
                    //cout<<nex<<endl;
                }
            }
            bits[i]=d;
        }
    }
    return -1;
}
int main(){
    io_opt;
    prime();
    cin>>T;
    while(T--){
        memset(f,false,sizeof(f));
        cin>>a>>b;
        if(a==b){
            cout<<0<<endl;
            continue;
        }
        int ans=bfs();
        if(ans==-1){
            cout<<"No solution"<<endl;
        }
        else{
            cout<<ans<<endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/sz-wcc/p/13187930.html