POJ3126 Prime Path【数论】【BFS】

2024-06-15 04:48
文章标签 poj3126 prime path bfs 数论

本文主要是介绍POJ3126 Prime Path【数论】【BFS】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:

http://poj.org/problem?id=3126


题目大意:

给你两个有四位数字的素数 A、B,问:每次只改变一个数字,且改变前后的数都是

素数,那么从 A 变到 B,最少需要多少次。


解题思路:

用 BFS 来做。判断素数用筛法求素数打表预处理一下,不过注意 1000 以下的数要

当非素数看待。

每次改变一位数字,并且如果改变后的数仍为素数的话入队,并用 cnt[] 来记录步数。

直到得到目标数的时候,返回结果。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 10100;bool Prime[MAXN];void IsPrime()
{Prime[0] = Prime[1] = false;for(int i = 2; i < MAXN; ++i)Prime[i] = true;for(int i = 2; i < MAXN; ++i){if(Prime[i]){for(int j = i+i; j < MAXN; j+=i)Prime[j] = false;}}for(int i = 2; i < 1000; ++i)Prime[i] = false;
}
bool vis[MAXN];
int t[5],cnt[MAXN];int Bfs(int S,int T)
{queue<int> q;memset(vis,false,sizeof(vis));memset(cnt,0,sizeof(cnt));q.push(S);vis[S] = true;while(!q.empty()){int v = q.front();q.pop();//存取各个位上数字t[0] = v/1000;t[1] = v/100%10;t[2] = v/10%10;t[3] = v%10; t[0]=v/1000;//    printf("%d %d %d %d\n",t[0],t[1],t[2],t[3]);for(int j = 0; j < 4; ++j){int temp = t[j];    //记录第 j 个数字for(int i = 0; i <= 9; ++i) //将 t[j] 改变为 i{if(i != temp){t[j] = i;int vtemp = t[0]*1000 + t[1]*100 + t[2]*10 + t[3];if(!vis[vtemp] && Prime[vtemp]){cnt[vtemp] = cnt[v] + 1;vis[vtemp] = true;q.push(vtemp);}if(vtemp == T)return cnt[vtemp];}}t[j] = temp;    //变回原本数字,继续改变另外数字}if(v == T)return cnt[v];}return -1;
}int main()
{int T,A,B;IsPrime();scanf("%d",&T);while(T--){scanf("%d%d",&A,&B);int Ans = Bfs(A,B);if(Ans == -1)printf("Impossible\n");elseprintf("%d\n",Ans);}return 0;
}


这篇关于POJ3126 Prime Path【数论】【BFS】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062467

相关文章

多源 BFS

例题一 解法(bfs)(多个源头的最短路问题) 算法思路: 对于求的最终结果,我们有两种⽅式: • 第⼀种⽅式:从每⼀个 1 开始,然后通过层序遍历找到离它最近的 0 。 这⼀种⽅式,我们会以所有的 1 起点,来⼀次层序遍历,势必会遍历到很多重复的点。并且如果 矩阵中只有⼀个 0 的话,每⼀次层序遍历都要遍历很多层,时间复

Android自定义系列——9.Path详细用法

rXxx方法 rXxx方法的坐标使用的是相对位置(基于当前点的位移),而之前方法的坐标是绝对位置(基于当前坐标系的坐标)。 Path path = new Path();path.moveTo(100,100);path.lineTo(100,200);canvas.drawPath(path,mDeafultPaint); 在这个例子中,先移动点到坐标(100,100)处,之后再连接

Android自定义系列——8.Path之贝塞尔曲线

贝塞尔曲线能干什么 贝塞尔曲线作用十分广泛,简单举几个的栗子: QQ小红点拖拽效果一些炫酷的下拉刷新控件阅读软件的翻书效果一些平滑的折线图的制作很多炫酷的动画效果 理解贝塞尔曲线的原理 一阶曲线原理: 一阶曲线是没有控制点的,仅有两个数据点(A 和 B),最终动态过程如下: (本文中贝塞尔曲线相关的动态演示图片来自维基百科)。一阶曲线其实就是前面讲解过的lineTo。 二阶曲线

Android自定义系列——7.Path之基本操作

Path常用方法表 为了兼容性(偷懒) 本表格中去除了部分API21(即安卓版本5.0)以上才添加的方法。 作用相关方法备注移动起点moveTo移动下一次操作的起点位置设置终点setLastPoint重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同连接直线lineTo添加上一个点到当前点之间的直线到Path闭合路径close连接第一个点连接到最后一个点,形成一个闭合

BFS:解决多源最短路问题

文章目录 什么是多源最短路问题?1.矩阵2.飞地的数量3.地图的最高点4.地图分析总结 什么是多源最短路问题? 多源最短路问题(Multi-Source Shortest Path Problem,MSSP)是图论中的一个经典问题,它的目标是在给定图中找到从多个源点到所有其他顶点的最短路径。这个问题可以视为单源最短路问题(Single-Source Shortest Pa

从PATH说起的shell命令行替换

许久之前,师弟问了我一个问题,为什么shell中添加环境变量的写法是下面这种方式 PATH=~/.lib:$PATH; export PATH 而下面这种会报错呢? $PATH=~/.lib:$PATH; export PATH 当时我的回答是,"shell就是这样子规定的呀"。 回答的同时,也突然间发现有些自己感觉很熟悉的概念,原来自己并没有那么清楚,因此这一篇讲讲shell的命令行

Java环境变量配置中有关JAVA_HOME,path,Classpath含义的讲解

一:Path变量 Path变量是操作系统的,用以找寻相关命令的。例如ping这个命令,你能在控制行里打ping 127.0.0.1而有程序执行并正确返回结果,是因为Path变量包含C:\Windows\System32。你可以在Path中把C:\Windows\System32去掉,再使用ping命令,就会提示找不到ping命令。 这就像你在你的办公桌上工作,需要用到各种工具,如钢笔,

[AIGC] 宽度优先搜索(BFS) 讲解以及在 LeetCode 题中的应用

宽度优先搜索(Breadth-First Search,简称 BFS)是一种用于图或树结构的遍历算法。它以广度方向进行搜索,首先访问根节点,然后访问所有相邻的节点,然后再通过它们的邻居一直进行下去,直到所有的节点都被访问过。 文章目录 BFS 的工作过程BFS 在 LeetCode 中的应用 BFS 的工作过程 BFS 从图的某一节点(称为“源”节点)开始,访问可能

BFS 解决最短路问题

例题一 解法(bfs 求最短路): 算法思路: 利⽤层序遍历来解决迷宫问题,是最经典的做法。我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出⼝的时候,得到起点到出⼝的最短距离。 例题二 解法: 算法思路: 如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为

用path画一个抽象的树叶

源码地址:https://github.com/X-FAN/LeafView 只是个简单的demo,大家可以参考下 public class PathTestView extends View {private int mWidth;private int mHeight;private int mDuration = 5000;private int mState = 0;//当前状态;pr