C语言用迪杰特斯拉算法寻矩形迷宫最短路径,附代码及样例
```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 int maze[MAX_SIZE][MAX_SIZE]; int visited[MAX_SIZE][MAX_SIZE]; int path[MAX_SIZE][2]; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; int minDistance(int dist[], int n) { int min = INT_MAX, min_index; for (int i = 0; i < n; i++) { if (visited[i] == 0 && dist[i] <= min) { min = dist[i]; min_index = i; } } return min_index; } int printPath(int path[][2], int size) { for (int i = 0; i < size; i++) { printf("%d %d\n", path[i][0], path[i][1]); } } void dijkstra(int n, int m) { int dist[n * m]; for (int i = 0; i < n * m; i++) { dist[i] = INT_MAX; visited[i] = 0; } int start_x, start_y; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (maze[i][j] == 3) { start_x = i; start_y = j; break; } } } dist[start_x * m + start_y] = 0; for (int i = 0; i < n * m; i++) { int u = minDistance(dist, n * m); visited[u] = 1; int x = u / m; int y = u % m; for (int j = 0; j < 4; j++) { int new_x = x + dx[j]; int new_y = y + dy[j]; if (new_x >= 0 && new_x < n && new_y >= 0 && new_y < m && maze[new_x][new_y] != 0 && visited[new_x * m + new_y] == 0) { if (dist[u] + 1 < dist[new_x * m + new_y]) { dist[new_x * m + new_y] = dist[u] + 1; path[dist[new_x * m + new_y] - 1][0] = new_x; path[dist[new_x * m + new_y] - 1][1] = new_y; } } } } int end_x, end_y; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (maze[i][j] == 4) { end_x = i; end_y = j; break; } } } int x = end_x, y = end_y, k = 0; while (x != start_x || y != start_y) { path[k][0] = x; path[k][1] = y; int min_dist = INT_MAX; int next_x, next_y; for (int j = 0; j < 4; j++) { int new_x = x + dx[j]; int new_y = y + dy[j]; if (new_x >= 0 && new_x < n && new_y >= 0 && new_y < m && maze[new_x][new_y] != 0 && visited[new_x * m + new_y] == 1 && dist[new_x * m + new_y] < min_dist) { min_dist = dist[new_x * m + new_y]; next_x = new_x; next_y = new_y; } } x = next_x; y = next_y; k++; } path[k][0] = x; path[k][1] = y; printPath(path, k + 1); } int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &maze[i][j]); } } dijkstra(n, m); return 0; } ``` 运行该程序,输入矩阵大小和矩阵中的元素,即可输出从入口到出口的最短路径上的每一个点的位置。 ######[AI写代码神器 | 2036点数解答 | 2024-12-16 22:29:21]
- Windows环境下C/C++项目开发:完整目录、文件路径及编译脚本设置示例(字节豆包 | 459点数解答 | 2024-11-02 20:38:01)251
- 迷宫探秘:求解扶苏走出数字矩阵迷宫所需步数及循环判定(字节豆包 | 819点数解答 | 2025-11-26 19:27:35)86
- 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切片操作巧解经典算法:二维数组90°旋转(阿里通义 | 205点数解答 | 2023-10-31 11:05:29)351
- 揭秘iOS开发:常用算法大集合,提升应用性能与体验!(阿里通义 | 246点数解答 | 2023-11-08 00:43:08)303
- 深入解析:Vue2.x与Vuex3.x渲染器的Diff算法奥秘(阿里通义 | 222点数解答 | 2023-11-09 01:35:41)380
- 突破 long 范围限制:用 BigInteger 类实现超大数字竖式乘法运算( | 555点数解答 | 2024-03-17 10:56:49)379
- 超范围数字乘法:字符串转数组+模拟竖式运算的实现攻略( | 377点数解答 | 2024-03-17 10:58:21)379
- Java 实现:突破 long 范围限制,模拟竖式运算处理大数字乘法( | 14点数解答 | 2024-03-17 10:58:39)356
- Java实现:突破long范围限制,模拟人工竖式运算大数字乘法( | 1022点数解答 | 2024-03-17 10:59:43)362