用c语言写一个迷宫(入口总在左上角,出口总在右下角),要求输入足够大的矩阵,0代表通路,1代表墙,输出最短路径的长度
时间: 2023-09-08 20:16:45 浏览: 122
好的,这是一个比较典型的迷宫最短路径问题,可以用广度优先搜索算法来解决。以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
typedef struct Node {
int x, y; // 节点的坐标
int step; // 从起点到该节点的步数
} Node;
int maze[MAX_SIZE][MAX_SIZE]; // 存储迷宫的矩阵
int visited[MAX_SIZE][MAX_SIZE]; // 标记节点是否被访问过
int dx[4] = {0, 0, 1, -1}; // 上下左右四个方向
int dy[4] = {1, -1, 0, 0};
Node queue[MAX_SIZE * MAX_SIZE]; // 存储待访问节点的队列
int bfs(int n, int m) {
memset(visited, 0, sizeof(visited)); // 初始化visited数组
visited[0][0] = 1; // 起点已经被访问过
int front = 0, rear = 0; // 队列的头尾指针
queue[rear++] = (Node){0, 0, 0}; // 将起点加入队列
while (front < rear) { // 队列不为空
Node node = queue[front++]; // 取出队头节点
if (node.x == n - 1 && node.y == m - 1) { // 找到终点
return node.step; // 返回最短路径长度
}
for (int i = 0; i < 4; i++) { // 枚举四个方向
int nx = node.x + dx[i], ny = node.y + dy[i]; // 计算新节点的坐标
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // 超出边界
if (visited[nx][ny] || maze[nx][ny] == 1) continue; // 已经访问过或者是墙
visited[nx][ny] = 1; // 标记节点已访问
queue[rear++] = (Node){nx, ny, node.step + 1}; // 将新节点加入队列
}
}
return -1; // 没有找到终点,返回-1
}
int main() {
int n, m;
printf("请输入迷宫的矩阵大小:\n");
scanf("%d%d", &n, &m);
printf("请输入迷宫的矩阵:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &maze[i][j]);
}
}
int ans = bfs(n, m);
if (ans == -1) {
printf("无法到达终点!\n");
} else {
printf("最短路径长度为:%d\n", ans);
}
return 0;
}
```
在这个程序中,我们首先定义了一个Node结构体来表示节点的坐标和步数。然后读入迷宫的矩阵,使用广度优先搜索算法来求解最短路径。具体来说,我们定义一个队列queue来存储待访问的节点,使用visited数组来标记节点是否被访问过。每次从队头取出一个节点,枚举它的四个方向,并判断是否超出边界、已经访问过或者是墙,如果是合法的节点,则将其加入队列,并标记已访问。当队列为空时,说明没有找到终点,返回-1即可。
阅读全文