poj3126求一个素数到另一个素数每次变化一个数字的变化次数

该博客介绍了一个算法问题,即求解从一个素数到另一个素数,每次只改变一个数字,最少需要多少步。通过使用广度优先搜索(BFS)策略,遍历所有可能的变化并记录步骤数,最终找到目标素数所需的最大步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
#define CLR(arr, val) memset(arr, val, sizeof(arr))
const int LEN=10010;
int prime[LEN], isqueue[LEN], steps[LEN];
int g, s, b, q;
void init()
{
    for(int i=2, j; i*i<=LEN; i++)
    {
        if( !prime[i] )
            for(j=i*i; j<=LEN; j+=i)
                prime[j]=1;
    }
}
inline void fun(int n)
{
    q=n/1000;
    b=n%1000/100;
    s=n%100/10;
    g=n%10;
}
inline int funa(int a, int b, int c, int d)
{
    return a*1000+b*100+c*10+d;
}
void BFS(int pa, int pb)
{
    queue<int> qq;
    qq.push(pa);
    isqueue[pa]=1;
    steps[pa]=0;
    int i, j, x, y;
    while( 1 )
    {
        x=qq.front();
        qq.pop();
        if( x==pb ) break;
        fun(x);
        for(i=1; i<10; i++)
        {
            y=funa(i, b, s, g);
            if( !prime[y] && !isqueue[y] )
            {
                qq.push(y);
                isqueue[y]=1;
                steps[y]=steps[x]+1;
            }
        }
        for(i=0; i<10; i++)
        {
            y=funa(q, i, s, g);
            if( !prime[y] && !isqueue[y] )
            {
                qq.push(y);
                isqueue[y]=1;
                steps[y]=steps[x]+1;
            }
        }
        for(i=0; i<10; i++)
        {
            y=funa(q, b, i, g);
            if( !prime[y] && !isqueue[y] )
            {
                qq.push(y);
                isqueue[y]=1;
                steps[y]=steps[x]+1;
            }
        }
        for(i=0; i<10; i++)
        {
            y=funa(q, b, s, i);
            if( !prime[y] && !isqueue[y] )
            {
                qq.push(y);
                isqueue[y]=1;
                steps[y]=steps[x]+1;
            }
        }
    }
}
int main()
{
    init();
    int T, pa, pb;
    cin >> T;
    while( T-- )
    {
        cin >> pa >> pb;
        if( pa==pb )
        {
            cout << 0 << endl;
            continue;
        }
        CLR(isqueue, 0);
        CLR(steps, 0);
        BFS(pa, pb);
        cout << steps[pb] << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值