AcWing 4220. 质数路径

给定两个四位质数 A 和 B,你需要通过最少的操作次数将 A 变为 B。

每次操作只能改变当前数的其中一位数字,并且每次操作过后,当前数必须仍然是一个质数。

例如,将 1033 变为 8179,最少需要进行 66 次操作,具体操作为:

1033 -> 1733 -> 3733 -> 3739 -> 3779 -> 8779 -> 8179

请计算并输出所需要的最少操作次数。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含两个四位质数 A 和 B。

输出格式

每组数据输出一行答案,表示所需最少操作次数。

如果无法做到,则输出 Impossible

经实际测试,不存在无解情况,特此声明。

数据范围

1≤T≤100。
1000≤A,B≤9999,
保证 A 和 B 都是质数。

输入样例:

3
1033 8179
1373 8017
1033 1033

输出样例:

6
7
0

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define int long long
typedef pairPII;
constexpr int N=10000;
int n,m;
int a[N];
int b[N];
int res=-1;
bool isPrime( int num )
{
    int tmp =sqrt( num);
    for(int i= 2;i <=tmp; i++) {
        if (num % i == 0)
            return false;
    }
    return true ;
}
void bfs(int x,int y) {
    queueq;
    q.push(x);
    while(q.size()) {
        int t = q.front();
        q.pop();
        if (t == y) {
            res = a[t];
            break;
        }
        for (int i = 0; i <= 9; i++) {
            int tp = t - t % 10 + i;
            if (isPrime(tp) && !b[tp]) {
                a[tp] = a[t] + 1, b[tp] = 1, q.push(tp);
            }
            tp = t - t % 100 +t%10+ i * 10;
            if (isPrime(tp) && !b[tp]) {
                a[tp] = a[t] + 1, b[tp] = 1, q.push(tp);
            }
            tp = t - t % 1000 +t%100+ i * 100;
            if (isPrime(tp) && !b[tp]) {
                a[tp] = a[t] + 1, b[tp] = 1, q.push(tp);
            }
            if (i != 0) {
                tp = t % 1000 + i * 1000;
                if (isPrime(tp) && !b[tp]) {
                    a[tp] = a[t] + 1, b[tp] = 1, q.push(tp);
                }
            }
        }
    }
}
signed main()
{
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        res=-1;
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        cin>>n>>m;
        b[n]=1;
         bfs(n,m);
         if(res==-1) cout<<"Impossible"<

 

你可能感兴趣的:(算法,c++)