迷宫搜索问题最短路_【算法常用模板】总结(更新中)

搜索类

图类

排序类

并查集

数学类

位运算

Part1 搜索类

bfs 求迷宫问题最短路径(未验证)

#include

#include

using namespace std;

//用于遍历的结构 (可以添加题目所要求的信息)

typedef struct Node{

int x,y;

int step;

}NODE;

const int NUM = 100; //地图最大范围,根据要求具体修改

int M,N;

int m[NUM][NUM]; // 地图数组

int vis[NUM][NUM];

bool check(NODE& node){

int x = node.x;

int y = node.y;

//三种不可访问情况

if(x < 1 || y < 1 || x > M || y > N ) return 0; //地图边界判断(一定要最先判断)

if(vis[x][y]) return 0; //是否被访问过判断

if(m[x][y] == '*') return 0; //是否是不可访问的节点判断(具体题目不同 假设为*)

//可访问

return 1;

}

//判断是否是所求的节点

bool checkRight(NODE& node){

if(m[node.x][node.y] == '1') return 1; //假设1为目标

return 0;

}

int mov[4][2]={{0,1},{0,-1},

{1,0},{-1,0}}; //用于移动的数组,这里是四个方向(具体问题具体分析)

NODE bfs(NODE startNode){

//初始化

queue Q;

vis[startNode.x][startNode.y] = 1;

Q.push(startNode);

//正式开始遍历

while(!Q.empty()){

NODE nowNode = Q.front(); //获取判断节点

if(checkRight(nowNode)) return nowNode; //达到目标节点,获取目标节点

//进行四个方向遍历(具体问题可能会不同)

for(int i = 0; i < 4; i++){

NODE nextNode;

//下一个位置信息

nextNode.step = nowNode.step + 1;

nextNode.x = nowNode.x + mov[i][0];

nextNode.y = nowNode.y + mov[i][1];

if(check(nextNode)){ //判断是否可访问;

vis[nextNode.x][nextNode.y] = 1; //标记为已访问

Q.push(nextNode);

}

}

}

}

int main(){

cin >> M >> N;

for(int i = 1; i <= M; i++)

for(int j = 1; j <= N; j++)

cin >> m[i][j];

//初始节点(根据题目具体要求位置)

NODE sNode;

sNode.step = 0;

sNode.x = 1;

sNode.y = 1;

NODE targetNode = bfs(sNode);

cout << targetNode.step << endl; //输出题目要的节点信息

}

dfs

求总的路径数目

Part2 图类

最小生成树 (Prim)

#include

using namespace std;

const int INF = 0x3fffffff;

int vis[N];

void prim(int c[][],int u) {

int i,j;

vis[u] = 1;

for(i = 1; i <= N; i++) {

closet[i] = c[u][i];

}

for(i = 0; i < N; i++){

int t = u;

int min = INF;

int j;

for(j = 1; j <= N; j++){

if(!vis[u] && lowcost[j] < min){

min = closet[j];

t = j;

}

}

if (t == u) break;

for(j = 1; j <= N; j++){

if(!vis[j] && lowcost[j]>c[t][j]){

lowcost[j] = c[t][j];

}

}

}

}

单元最短路 (DJ)

const int MAXINT = 32767;

const int MAXNUM = 10;

int dist[MAXNUM];

int prev[MAXNUM];

int A[MAXUNM][MAXNUM];

void Dijkstra(int v0)

{

bool S[MAXNUM]; // 判断是否已存入该点到S集合中

int n=MAXNUM;

for(int i=1; i<=n; ++i)

{

dist[i] = A[v0][i];

S[i] = false; // 初始都未用过该点

if(dist[i] == MAXINT)

prev[i] = -1;

else

prev[i] = v0;

}

dist[v0] = 0;

S[v0] = true;

for(int i=2; i<=n; i++)

{

int mindist = MAXINT;

int u = v0;    // 找出当前未使用的点j的dist[j]最小值

for(int j=1; j<=n; ++j)

if((!S[j]) && dist[j]

{

u = j; // u保存当前邻接点中距离最小的点的号码

mindist = dist[j];

}

S[u] = true;

for(int j=1; j<=n; j++)

if((!S[j]) && A[u][j]

{

if(dist[u] + A[u][j] < dist[j]) //在通过新加入的u点路径找到离v0点更短的路径

{

dist[j] = dist[u] + A[u][j]; //更新dist

prev[j] = u; //记录前驱顶点

}

}

}

}

多源最短路 (Floyd)

typedef struct

{

char vertex[VertexNum]; //顶点表

int edges[VertexNum][VertexNum]; //邻接矩阵,可看做边表

int n,e; //图中当前的顶点数和边数

}MGraph;

void Floyd(MGraph g)

{

int A[MAXV][MAXV];

int path[MAXV][MAXV];

int i,j,k,n=g.n;

for(i=0;i

for(j=0;j

{

A[i][j]=g.edges[i][j];

path[i][j]=-1;

}

for(k=0;k

{

for(i=0;i

for(j=0;j

if(A[i][j]>(A[i][k]+A[k][j]))

{   A[i][j]=A[i][k]+A[k][j];

path[i][j]=k;

}

} }

Part3 排序类

数组排序 sort

可对任意类型的数组排序。可以自定义排序规则

#include //头文件

sort(数组名,数组名+数组长度) //自定义排序

sort(数组名,数组名+数组长度,cmp比较规则) //自定义排序

//自定义排序规则

bool cmp(Node& a , Node& b){

if(a.x == b.x) return a.y < b.y;

return a.x < b.x;

}

cmp排序函数的自定义方法:

return true 就是a在b前

return false 就是b在a前

默认排序例子(小到大)

#include

#include

using namespace std;

const int N = 5;

int main(){

int arr[N];

for(int i = 0; i < 5; i++){

cin >> arr[i];

}

sort(arr, arr + N);

for(int i = 0; i < 5; i++){

cout << arr[i] <

}

return 0;

}

自定义排序例子

#include

#include

using namespace std;

typedef struct NODE{

int x,y;

}Node;

//自定义排序规则

bool cmp(Node& a , Node& b){

if(a.x == b.x) return a.y < b.y;

return a.x < b.x;

}

const int N = 5;

int main(){

Node arr[N];

for(int i = 0; i < 5; i++){

cin >> arr[i].x >> arr[i].y;

}

sort(arr, arr + N, cmp); //自定义排序

for(int i = 0; i < 5; i++){

cout << arr[i].x << " " <

}

return 0;

}

优先队列 priority_queue

用于动态排序的结构(需要不断的改变排序的元素)

如:哈夫曼树的构造

#include

priotrity_queue pq //默认定义 从大到小

priotrity_queue,cmp > pq

//自定义排序规则 (有两种不用自己写的规则less和greater less和默认一样从大到小 greater从小到大)

struct cmp {

bool operator() (Node& a , Node& b) {

if (a.x == b.x) return a.y < b.y;

return a.x < b.x;

}

};

//基本方法

pq.push(node) //加入队列

pq.empty() //队列是否

pq.top() //获得队头元素(注意和queue的区别,queue是front)

pq.pop() //出队

注意:true false 对应的方向刚好与sort相反

初步使用

#include

#include

#include

#include

using namespace std;

const int N = 5;

int main(){

priority_queue, greater > pq; //整型从小到大

// priority_queue, less > pq; //整型从大到小 同priority_queue pq;

int x;

for(int i = 0; i < 5; i++){

cin >> x;

pq.push(x);

}

while(!pq.empty()){

cout << pq.top() <

pq.pop();

}

return 0;

}

自定义排序例子

#include

#include

#include

#include

#define Node ElemType

using namespace std;

const int N = 5;

typedef struct NODE{

int x,y;

}Node;

//自定义排序规则

struct cmp {

bool operator() (Node& a , Node& b) {

if (a.x == b.x) return a.y < b.y;

return a.x < b.x;

}

};

int main(){

Node arr[N];

priority_queue, cmp> pq;

for(int i = 0; i < 5; i++){

cin >> arr[i].x >> arr[i].y;

pq.push(arr[i]);

}

while(!pq.empty()){

cout << pq.top().x << " " << pq.top().y <

pq.pop();

}

return 0;

}

Part4 并查集

初始化数组为-1

find(int a); //找老大

union(int a, int b) // a集团加入b集团

不带路径压缩:

int find(int a){

return boss[a]?find(a):a;

}

void union(int a, int b){

int fa = find(a);

int fb = find(b);

boss[a] = b;

}

带路径压缩:

int find(int a){

int bigBoss;

int son = a;

int temp;

while(boss[a]) a = boss[a];

bigBoss = a; //找到大老板

//把路径上的上司不是大老板的全部直属大老板

while( son != bigBoss ){

temp = boss[son];

boss[son] = bigBoss;

son = temp;

}

return bigBoss;

}

void union(int a, int b){

int fa = find(a);

int fb = find(b);

boss[a] = b;

}

Part5 数学类

最大公因数(辗转相除法)

int gcd(int a, int b){

return b>0?gcd(b,a%b):a;

}

最小公倍数

int gcd(int a, int b){

return b>0?gcd(b,a%b):a;

}

int lcm(int a, int b){

return a*b/gcd(a,b);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hook 监控文件 c++_技术分享 | Linux 入侵检测中的进程创建监控

作者简介&#xff1a;张博&#xff0c;网易高级信息安全工程师。0x00 简介在入侵检测的过程中&#xff0c;进程创建监控是必不可少的一点&#xff0c;因为攻击者的绝大多数攻击行为都是以进程的方式呈现&#xff0c;所以及时获取到新进程创建的信息能帮助我们快速地定位攻击行为…

caffe模型文件解析_Caffe ImageData神经网络基本示例无法解析模型文件

我正在尝试使用我使用caffe库从CSV文件准备的 **_图像数据_** 构建神经网络的最小示例。I am trying to build a minimal example of a neural network with **_IMAGE DATA_** that I have prepared from a CSV file using the caffe libraries.我的原始文本如下&#xff1a;\[…

付忠庆的练习小笔记-Codeforces #277 Div2 C

原题链接 http://codeforces.com/contest/486/problem/C 这个C题显然更水一些 步数可以分为两种 上下一种 左右一种 总步数最小 上下最小左右最小 先讨论上下最小 就是从两个方向去由字母1到字母2 min(dis(A,B),26-dis(A,B)); 然后讨论左右最小 pos是起始指针的位置 1-统一在…

Java 类的封装、继承、多态

// 封装、继承、多态 class Person1{String name;int age;private int height;// 私有 封装public Person1(String name, int age){this.name name;this.age age;}public void talk(){System.out.println("This is father class talk() !");}public void setHeight…

hive 创建表_2min快速了解,Hive内部表和外部表

在了解内部表和外部表区别前&#xff0c;我们需要先了解一下Hive架构 &#xff1a;大家可以简单看一下这个架构图&#xff0c;我介绍其中要点&#xff1a;Hive的数据分为两种&#xff0c;一种为普通数据&#xff0c;一种为元数据。元数据存储着表的基本信息&#xff0c;增删改查…

C#微信公众号开发系列教程二(新手接入指南)

此系列前面已经更新了两篇博文了&#xff0c;都是微信开发的前期准备工作&#xff0c;现在切入正题&#xff0c;本篇讲解新手接入的步骤与方法&#xff0c;大神可直接跳过&#xff0c;也欢迎大神吐槽。 微信公众号开发系列教程一&#xff08;调试环境部署&#xff09; 微信公众…

oracle增加字段为主键自增_在 Oracle 中设置自增列

如果你经常使用 MySQL&#xff0c;你肯定对 AUTO_INCREMENT 非常熟悉&#xff0c;因为经常要用到它。一、什么是自增列 &#xff1f;自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段&#xff0c;这样每次增加一行时&#xff0c;不用指该字段的值&am…

Java 抽象类、接口

abstract class 抽象类定义规则如下: (1) 抽象类和抽象方法都必须用 abstract 关键字来修饰。 (2) 抽象类不能被直接实例化&#xff0c;也就是不能用new关键字去产生对象。 (3) 抽象方法只需声明&#xff0c;而不需实现。 (4) 含有抽象方法的类必须被声明为抽象类&#xff0c…

fastdfs windows部署_Go在windows下编译Linux可执行文件

欢迎关注我的头条号&#xff1a;Wooola&#xff0c;专注于Java、Golang、微服务架构&#xff0c;致力于每天分享原创文章、快乐编码和开源技术。前言最近楼主做了一个滑块验证码登录功能&#xff0c;但有个问题&#xff0c;悲观估计一天大约会产生两百多G临时图片放在fastdfs文…

python按索引删除字符串,基于特定的索引字符串值选择记录,然后通过python删除后续字段...

I have a .csv file named file01.csv that contains many records. Some records are required and some are not. I find that the required records has a string variable “Mi”, but it is not exist into the unnecessary records. So, I want to select the required r…

我们并没有觉得MapReduce速度慢,直到Spark出现

learn from 从0开始学大数据&#xff08;极客时间&#xff09; Spark 拥有更快的执行速度 更友好的编程接口 迅速抢占 MapReduce 的市场份额&#xff0c;成为主流的大数据计算框架 val textFile sc.textFile("hdfs://...") // 根据 HDFS 路径生成一个输入数据 RDD v…

python远程调用摄像头_Python设置Socket代理及实现远程摄像头控制的例子

为python设置socket代理首先,你得下载SocksiPy这个.解压出来之后里面会有一个socks.py文件.然后你可以把这个文件复制到python安装目录里面的Lib\site-packages中.或者把这个文件复制到程序所在的目录中. 然后就可以再程序中使用socket代理来编写程序了. 下面是示例代码 import…

基于ArcEngine与C#的鹰眼地图实现

鹰眼图是对全局地图的一种概略表达&#xff0c;具有与全局地图的空间参考和空间范围。为了更好起到空间提示和导航作用&#xff0c;有些还具备全局地图中重要地理要素&#xff0c;如主要河流、道路等的概略表达。通过两个axMapControl控件&#xff0c;主控件axMapControl 1和鹰…

LeetCode 1178. 猜字谜(状态压缩+枚举二进制子集+哈希)

文章目录1. 题目2. 解题1. 题目 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏&#xff0c;请你来猜猜看吧。 字谜的迷面 puzzle 按字符串形式给出&#xff0c;如果一个单词 word 符合下面两个条件&#xff0c;那么它就可以算作谜底&#xff1a; 单词 word 中包含谜面 …

elasticsearch 工作原理_【154期】面试官:你能说说 Elasticsearch 查询数据的工作原理是什么吗?...

点击上方“Java面试题精选”&#xff0c;关注公众号面试刷图&#xff0c;查缺补漏>>号外&#xff1a;往期面试题&#xff0c;10篇为一个单位归置到本公众号菜单栏->面试题&#xff0c;有需要的欢迎翻阅阶段汇总集合&#xff1a;一百期面试题汇总面试题ES 写入数据的工…

php另类上传图片的方法(PHP用Socket上传图片)

服务器端&#xff1a; 。 代码如下:<?phpset_time_limit(10);//* 设置不显示任何错误 *///error_reporting(0); function varinfo($str) {echo "<PRe>";var_dump($str);echo "<pre>";} $commonProtocol getprotobyname("tcp");…

java会被淘汰吗_Java不会被淘汰的12个原因

如今&#xff0c;面对曾经在程序员中被各种新技术掩盖直至堙灭的技术值得怀念。犹如COBOL这当年被老程序员们尊为神器的语言如今也基本没有价值。而Java作为现代程序员的中坚力量在这点上或许会成为下一个COBOL。有关JAVA的技术卖出多少本书已经是一个很久远的记忆了。现处中年…

Java 关于类的专题

文章目录1. Object 类2. 内部类3. 覆写 Object 类的 equals 方法4. 接口对象实例化5. this() 调用无参构造方法6. static 属性所有对象共享一份7. static 方法不能调用 非static 属性8. 静态代码块9. final 关键字10. instanceof 关键字1. Object 类 所有的类都是继承于 Objec…

pythonmain是什么意思_Python中if __name__ == __main__详细解释

想必很多初次接触python都会见到这样一个语句&#xff0c;if __name__ "__main__"&#xff1a; 那么这个语句到底是做什么用的呢&#xff1f;在解释之前&#xff0c;首先要声明的是&#xff0c;不管你是多么小白&#xff0c;你一定要知道的是&#xff1a; 1.python文…

java操作redis的操作_Java操作redis简单示例

第一&#xff1a;安装Redis首先我们要安装Redis&#xff0c;就像我们操作数据库一样&#xff0c;在操作之前肯定要先创建好数据库的环境。Redis的下载可以百度一下&#xff0c;或者打开下面的下载链接&#xff1a;https://github.com/MSOpenTech/redis也可以从我的百度网盘下载…