POJ - 3126 Prime Path (BFS)

15 篇文章 0 订阅

题目大意:给两个四位的素数 A,B,每次只允许变换一个数字,换完后的四位数也要求是素数,问几步能使 A 换成 B,无法换到输出 Impossible
解题思路:4 位数字,每位数字可以换成 0~9,粗糙看一下是40个入口的BFS。
剪枝:
1、千位不能为 0
2、不能换成自己
3、替换后的数字也要是素数
判定素数这边先打一个素数表

//素数打表
void isprime() {
    memset(prime, true, sizeof(prime));
    for (int i = 2; i <= sqrt(MAXN); i++) 
        for (int j = i+i; j <= MAXN; j+=i)
            prime[j] = false;
}

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int INF = 0x3f3f3f3f;
const int NINF = -INF -1;
const int MAXN = 10000+10;
using namespace std;
bool prime[MAXN], vis[MAXN];
int cnt[MAXN];
queue<int> q;
int T, a, b;
bool flag;
void isprime() {
    memset(prime, true, sizeof(prime));
    for (int i = 2; i <= sqrt(MAXN); i++) 
        for (int j = i+i; j <= MAXN; j+=i)
            prime[j] = false;
}
void bfs(int cur, int tag) {
    if (cur == tag) {
        flag = true;
        return;
    }
    q.push(cur);
    vis[cur] = true;
    int dig[4];
    while (!q.empty()) {
        int now = q.front();
        q.pop();
//      printf("%d\n", now);

        dig[0] = now/1000;
        dig[1] = now%1000/100;
        dig[2] = now%100/10;
        dig[3] = now%10;

        for (int i = 0; i < 4; i++) {
            int tmp = dig[i];
            for (int j = 0; j < 10; j++) {
                if (i == 0 && j == 0) continue;
                if (j != tmp) {
                    dig[i] = j;
                    int num = dig[0]*1000+dig[1]*100+dig[2]*10+dig[3];
                    if (!vis[num] && prime[num]) {
                        cnt[num] = cnt[now] + 1;
                        q.push(num);
                        vis[num] = true;
                    }
                    if (num == b) {
                        flag = true;    
                        return;
                    }
                }
            }
            dig[i] = tmp;
        }
    }
}
int main() {
    isprime();
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d", &a, &b);
        memset(vis, 0, sizeof(vis));
        memset(cnt, 0, sizeof(cnt));
        flag = false;
        while (!q.empty()) q.pop();
        bfs(a, b);
        if (flag) printf("%d\n", cnt[b]);
        else printf("Impossible\n");

    }
    return 0;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值