C语言迪杰特斯拉算法:精准求解矩形迷宫最短路径并输出节点位置
```c #include <stdio.h> #include <stdlib.h> // 定义一个结构体来表示矩阵中的点 typedef struct Point { int x; int y; } Point; // 定义一个结构体来表示队列中的节点 typedef struct QueueNode { Point point; int distance; struct QueueNode *next; } QueueNode; // 初始化队列 QueueNode *initQueue() { return NULL; } // 入队操作 void enqueue(QueueNode head, QueueNode tail, Point point, int distance) { QueueNode *newNode = (QueueNode *)malloc(sizeof(QueueNode)); newNode->point = point; newNode->distance = distance; newNode->next = NULL; if (*head == NULL) { *head = newNode; } else { (*tail)->next = newNode; } *tail = newNode; } // 出队操作 QueueNode *dequeue(QueueNode head, QueueNode tail) { if (*head == NULL) { return NULL; } QueueNode *temp = *head; *head = (*head)->next; if (*head == NULL) { *tail = NULL; } return temp; } // 判断一个点是否合法 int is_valid(int rows, int cols, int x, int y) { return x >= 0 && x < rows && y >= 0 && y < cols; } // 迪杰特斯拉算法 void dijkstra(int rows, int cols, int maze[][cols], Point start, Point end) { int distances[rows][cols]; int visited[rows][cols]; QueueNode *head = initQueue(); QueueNode *tail = NULL; // 初始化距离和访问数组 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { distances[i][j] = INT_MAX; visited[i][j] = 0; } } distances[start.x][start.y] = 0; enqueue(&head, &tail, start, 0); while (head!= NULL) { QueueNode *current = dequeue(&head, &tail); Point p = current->point; visited[p.x][p.y] = 1; int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; for (int i = 0; i < 4; i++) { int newX = p.x + dx[i]; int newY = p.y + dy[i]; if (is_valid(rows, cols, newX, newY) && maze[newX][newY]!= 0 &&!visited[newX][newY]) { int newDistance = distances[p.x][p.y] + 1; if (newDistance < distances[newX][newY]) { distances[newX][newY] = newDistance; Point newPoint = {newX, newY}; enqueue(&head, &tail, newPoint, newDistance); } } } } // 输出最短路径 if (distances[end.x][end.y]!= INT_MAX) { Point current = end; while (current.x!= start.x || current.y!= start.y) { printf("%d %d\n", current.x, current.y); int minDistance = INT_MAX; Point minPoint; int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; for (int i = 0; i < 4; i++) { int newX = current.x + dx[i]; int newY = current.y + dy[i]; if (is_valid(rows, cols, newX, newY) && distances[newX][newY] < minDistance) { minDistance = distances[newX][newY]; minPoint = {newX, newY}; } } current = minPoint; } printf("%d %d\n", start.x, start.y); } else { printf("No path found!\n"); } } int main() { int rows, cols; scanf("%d %d", &rows, &cols); int maze[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { scanf("%d", &maze[i][j]); } } Point start = {-1, -1}; Point end = {-1, -1}; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (maze[i][j] == 3) { start.x = i; start.y = j; } else if (maze[i][j] == 4) { end.x = i; end.y = j; } } } dijkstra(rows, cols, maze, start, end); return 0; } ``` 以下是 3 点额外需要注意的逻辑点: 1. 输入的矩阵数据要确保准确无误,否则可能导致算法出错。 2. 对于边界情况的处理要仔细,比如在遍历相邻点时,要确保不会越界。 3. 输出的路径顺序要按照从入口到出口的顺序,并且要包含入口和出口点。 ######[AI写代码神器 | 1362点数解答 | 2024-12-16 22:29:42]
- 数轴旅行:从原点出发,能否到达目标位置?(字节豆包 | 225点数解答 | 2026-01-23 19:51:03)62
- Windows环境下C/C++项目开发:完整目录、文件路径及编译脚本设置示例(字节豆包 | 459点数解答 | 2024-11-02 20:38:01)251
- 微信收款助手监控程序代码剖析:功能、问题与改进方向(DeepSeek | 282点数解答 | 2025-04-11 00:32:28)223
- 迷宫探秘:求解扶苏走出数字矩阵迷宫所需步数及循环判定(字节豆包 | 819点数解答 | 2025-11-26 19:27:35)86
- 数字化制图综合平台:助力企业转型,推动烟草物流图纸智能化设计 (字节豆包 | 490点数解答 | 2024-10-30 20:30:29)159
- 数字化制图综合平台:引领烟草物流及多领域设计革新 在企业数字化转型的时代浪潮中,数字化制图技术创新应用成为产业升级与提升竞争力的关键。企业对高效、精准、智能化设计解决方案需求迫切,构建集二维到三维正逆向工程快捷化、干涉检测可视化、设备明细数据提取自动化以及设备模块模型库于一体的综合平台意义重大。 此平台集成先进数字化制图工具与智能算法,可实现二维设计到三维建模的无缝转换,大大缩短设计周期。正逆向工程能快速切换,满足不同场景设计需求。内置干涉检测功能可实时监测设计潜在冲突,保障设计方案可行与安全。设备明细数据自动提取提高设计准确性与效率。设备模块模型库为设计师提供丰富资源,支持设计标准化与模块化,加速项目推进。 整体来看,该综合平台的应用极大促进了烟草物流行业及更广泛领域的技术创新与效率提升。在烟草物流方案图纸智能化设计中,它提升了图纸设计效率与质量,使设计工作更加高效、精准。对于企业而言,这一平台带来显著竞争优势,能帮助企业在数字化转型中脱颖而出,在激烈的市场竞争中占据有利地位,推动整个行业向更高效、更智能的方向发展。 (阿里通义 | 216点数解答 | 2024-10-30 20:30:51)190
- Java 简单工厂模式:打造可扩展的几何图形绘图工具类(阿里通义 | 570点数解答 | 2024-11-30 14:40:37)170
- Java 运用简单工厂模式构建多几何形状绘图工具类全解析 (字节豆包 | 584点数解答 | 2024-11-30 14:41:44)158
- Python 破解:计算 n*n 网格中只含 1 的最大矩形数字和! (字节豆包 | 534点数解答 | 2026-02-07 20:24:57)33
- Python Tkinter 代码剖析:GUI 程序搭建与窗口居中函数解析(字节豆包 | 314点数解答 | 2024-08-02 14:49:22)347
- 巧用 CDN 搭建含照片轮播、社交链接与 AI 对话的单页个人网页(字节豆包 | 485点数解答 | 2024-10-28 23:31:13)263
- 巧用 CDN 搭建单页个人网页:含照片轮播、社交链接与 AI 对话界面 (阿里通义 | 1752点数解答 | 2024-10-28 23:32:45)253