c语言求最短路径,自定义网格

时间: 2023-11-08 15:57:17 浏览: 38
这里提供一种基于Dijkstra算法的求最短路径的C语言实现,以自定义网格为输入。代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> #define ROW 5 // 网格行数 #define COL 5 // 网格列数 struct Node { int row, col; // 节点坐标 int dist; // 起点到该节点的距离 int visited; // 是否已访问 struct Node* prev; // 最短路径中该节点的前驱节点 }; struct Node* create_node(int row, int col, int dist, struct Node* prev) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->row = row; node->col = col; node->dist = dist; node->visited = 0; node->prev = prev; return node; } int min_distance(struct Node* nodes[]) { int min_dist = INT_MAX; struct Node* min_node = NULL; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (!nodes[i][j].visited && nodes[i][j].dist < min_dist) { min_dist = nodes[i][j].dist; min_node = &nodes[i][j]; } } } return min_node ? min_node->row * COL + min_node->col : -1; } void dijkstra(int grid[ROW][COL], int start_row, int start_col, int end_row, int end_col) { struct Node* nodes[ROW]; for (int i = 0; i < ROW; i++) { nodes[i] = (struct Node*)malloc(COL * sizeof(struct Node)); for (int j = 0; j < COL; j++) { nodes[i][j] = *create_node(i, j, INT_MAX, NULL); } } nodes[start_row][start_col].dist = 0; while (1) { int curr = min_distance(nodes); if (curr == -1) break; int curr_row = curr / COL, curr_col = curr % COL; nodes[curr_row][curr_col].visited = 1; if (curr_row == end_row && curr_col == end_col) break; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; int neighbor_row = curr_row + i, neighbor_col = curr_col + j; if (neighbor_row < 0 || neighbor_row >= ROW || neighbor_col < 0 || neighbor_col >= COL) continue; if (grid[neighbor_row][neighbor_col] == 0) continue; int alt = nodes[curr_row][curr_col].dist + grid[neighbor_row][neighbor_col]; if (alt < nodes[neighbor_row][neighbor_col].dist) { nodes[neighbor_row][neighbor_col].dist = alt; nodes[neighbor_row][neighbor_col].prev = &nodes[curr_row][curr_col]; } } } } if (nodes[end_row][end_col].dist == INT_MAX) { printf("No path found.\n"); } else { printf("Shortest path distance: %d\n", nodes[end_row][end_col].dist); printf("Shortest path: "); struct Node* curr = &nodes[end_row][end_col]; while (curr) { printf("(%d,%d) ", curr->row, curr->col); curr = curr->prev; } printf("\n"); } for (int i = 0; i < ROW; i++) { free(nodes[i]); } } int main() { int grid[ROW][COL] = { {1, 2, 3, 4, 5}, {1, 0, 1, 0, 1}, {1, 1, 1, 1, 1}, {0, 0, 0, 1, 0}, {1, 1, 1, 1, 1} }; dijkstra(grid, 0, 0, 4, 4); return 0; } ``` 该代码首先定义了一个Node结构体表示网格中的节点,包含节点的坐标、从起点到该节点的距离、是否已访问以及最短路径中该节点的前驱节点。create_node函数用于创建一个新的节点。min_distance函数用于在未访问的节点中查找距离起点最近的节点。dijkstra函数则是实现Dijkstra算法的核心函数,其中使用nodes数组存储所有节点的状态。首先将起点的距离设为0,然后循环查找未访问的节点中距离起点最近的节点,并将其标记为已访问。接着遍历该节点的所有邻居节点,如果邻居节点未访问且到起点的距离可以缩短,则更新邻居节点的状态。最后,如果终点已访问,则结束循环。如果终点未访问,则说明不存在从起点到终点的路径。最后释放nodes数组中的所有节点。 该代码针对一个5x5的网格进行了测试,其中1表示可通过的节点,0表示不可通过的节点。起点为(0,0),终点为(4,4)。运行结果如下: ``` Shortest path distance: 12 Shortest path: (4,4) (3,4) (2,4) (1,4) (0,4) (0,3) (0,2) (0,1) (0,0) ``` 可以看到,起点到终点的最短路径的长度为12,路径为(4,4) (3,4) (2,4) (1,4) (0,4) (0,3) (0,2) (0,1) (0,0)。 这个算法可以用于解决很多实际问题,比如地图导航、网络路由等。

相关推荐

最新推荐

recommend-type

C++用Dijkstra(迪杰斯特拉)算法求最短路径

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。...下面这篇文章就给大家介绍关于C++用Dijkstra算法(迪杰斯特拉算法)求最短路径的方法,下面来一起看看吧。
recommend-type

C语言求解无向图顶点之间的所有最短路径

主要为大家详细介绍了C语言求解无向图顶点之间的所有最短路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

带权图求最短路径课程设计报告

带权图求最短路径:如果给出了一个带权图,则可以试设计一个算法,求图中一个源点到其他各顶点的最短路径。试编写实现上述功能的程序。已知带权图,设计完成下列任务的一个算法: (1)用邻接表表示图; (2)按长度...
recommend-type

华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip

华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依