POJ 3126 Prime Path

本文介绍了一个基于广度优先搜索(BFS)算法解决质数迷宫问题的方法。通过改变数字的每一位来生成新的质数并检查其可达性,最终找出从一个质数到另一个质数的最短路径。

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

BFS超级水题= =

但是其实要不是看到它分类在BFS里面我都想爆搜了= =

然后就没有然后了

就是每一位上的数不断的变化,判断是否为质数,并且此数是否已经被访问过

很基本的BFS

没什么难的,就是注意要剪枝,别TLE了

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int m,n;
bool vis[10001];
struct node
{
    int prime;
    int step;
}now,next;
bool JudgePrime(int digit)
{
    if(digit==2 || digit==3)
        return true;
    else if(digit<=1 || digit%2==0)
        return false;
    else if(digit>3)
    {
        for(int i=3;i*i<=digit;i+=2)
            if(digit%i==0)
                return false;
        return true;
    }
}
void bfs()
{
    queue<node> q;
    now.prime=m;
    now.step=0;
    q.push(now);
    vis[m]=true;
    while(!q.empty())
    {
        now=q.front();
        if(now.prime==n)
        {
            cout<<now.step<<endl;
            return ;
        }
        int x=now.prime%10;
        int y=(now.prime/10)%10;
        q.pop();
        for(int i=0;i<=9;i++)//gewei
        {
            next.prime=(now.prime/10)*10+i;
            if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
            {
                vis[next.prime]=true;
                next.step=now.step+1;
                q.push(next);
            }
        }
        for(int i=0;i<=9;i++)
        {
            next.prime=(now.prime/100)*100+i*10+x;
            if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
            {
                vis[next.prime]=true;
                next.step=now.step+1;
                q.push(next);
            }
        }
        for(int i=0;i<=9;i++)
        {
            next.prime=(now.prime/1000)*1000+i*100+y*10+x;
            if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
            {
                vis[next.prime]=true;
                next.step=now.step+1;
                q.push(next);
            }
        }
        for(int i=1;i<=9;i++)
        {
            next.prime=now.prime%1000+i*1000;
            if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
            {
                vis[next.prime]=true;
                next.step=now.step+1;
                q.push(next);
            }
        }
    }
    cout<<"Impossible"<<endl;
    return;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof vis);
        scanf("%d%d",&m,&n);
        bfs();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值