质数路径(bfs)

原题链接

解题思路:本题只需要枚举一下某个点能向外拓展的情况即可,注意不能有前导零。其次再用线性筛法预处理一下质数。
C++代码
#include 
// #define int long long 
using namespace std;
const int N = 1e4 + 10;
int primes[N], cnt;
int t, a, b;
bool st[N], vis[N]; //st用于记录质数, vis记录该数是否访问过

void init() //线性筛法
{
    st[0] = true, st[1] = true;
    for (int i = 2; i <= N; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= N / i; j ++ )
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

int bfs()
{
    queue> q;
    q.push({a, 0});
    while (q.size())
    {
        auto t = q.front();
        q.pop();
        if (t.first == b) return t.second;
        int tmp = t.first, dist = t.second;
        for (int i = 0; i <= 9; i ++ ) //枚举个位数
        {
            if (!st[tmp / 10 * 10 + i] && !vis[tmp / 10 * 10 + i])
            {
                q.push({tmp / 10 * 10 + i, dist + 1});
                vis[tmp / 10 * 10 + i] = true;
            }
        }
        for (int i = 0; i <= 9; i ++ ) //枚举十位数
        {
            if (!st[tmp / 100 * 100 + i * 10 + tmp % 10] && !vis[tmp / 100 * 100 + i * 10 + tmp % 10])
            {
                q.push({tmp / 100 * 100 + i * 10 + tmp % 10, dist + 1});
                vis[tmp / 100 * 100 + i * 10 + tmp % 10] = true;
            }
        }
        for (int i = 0; i <= 9; i ++ ) //枚举百位数
        {
            if (!st[tmp / 1000 * 1000 + i * 100 + tmp % 100] && !vis[tmp / 1000 * 1000 + i * 100 + tmp % 100])
            {
                q.push({tmp / 1000 * 1000 + i * 100 + tmp % 100, dist + 1});
                vis[tmp / 1000 * 1000 + i * 100 + tmp % 100] = true;
            }
        }
        for (int i = 1; i <= 9; i ++ ) //枚举千位数
        {
            if (!st[i * 1000 + tmp % 1000] && !vis[i * 1000 + tmp % 1000])
            {
                q.push({i * 1000 + tmp % 1000, dist + 1});
                vis[i * 1000 + tmp % 1000] = true;
            }
        }
    }
}

signed main()
{
    init();
    cin >> t;
    while (t -- )
    {
        memset(vis, 0, sizeof vis);
        cin >> a >> b;
        cout << bfs() << endl;
    }
    return 0;
}

创作不易,大家可以在AcWing注册账号,参与一下AC之星计划,我的邀请码是MYRGS。对题解有任何疑问可以在评论区下面评论在这里插入图片描述

你可能感兴趣的:(kuangbin,宽度优先,c++,算法)