写一个c语言下图给出了一个迷宫的平面图,其中标记为黑色的为障碍,标记为白色的为可以通行的区域。迷宫的入口为左上角的黄色方格,出口为右下角的黄色方格。在迷宫中,只能从一个方格走到相邻的上、下、左、右四个方向之一。 找到一条从起点到终点的迷宫路径,并将路径输出。如果从起点到终点没有路径,则输出NO PASS! 注:所有迷宫的起点为左上角,终点为右下角。 【输入形式】依次输入n行由0和1构成的字符串,每行字符串长度相同,输入空串结束,其中1表示围墙,0表示可行路径。 【输出形式】如果起点到终点有路,则依次输出由L、R、D、U组成的路径字符串;否则输出NO PASS!。
时间: 2024-02-25 15:58:17 浏览: 49
以下是一个使用广度优先搜索算法(BFS)解决迷宫问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAXN 100
typedef struct {
int x, y;
} Point;
// 可以通行的区域用0表示,障碍用1表示
int map[MAXN][MAXN];
// 记录起点到每个点的最短距离
int dist[MAXN][MAXN];
// 记录从起点到每个点的路径
char path[MAXN][MAXN];
// 记录队列中每个元素的信息
typedef struct {
Point pos;
int step;
} QueueElement;
// 实现一个队列
QueueElement queue[MAXN * MAXN];
int front = 0, rear = 0;
// 将元素插入队列尾部
void enqueue(QueueElement elem) {
queue[rear++] = elem;
}
// 取出队列头部元素
QueueElement dequeue() {
return queue[front++];
}
// 判断一个点是否在地图范围内并且没有被访问过
bool is_valid(Point pos) {
return pos.x >= 0 && pos.x < MAXN
&& pos.y >= 0 && pos.y < MAXN
&& dist[pos.x][pos.y] == -1
&& map[pos.x][pos.y] == 0;
}
// 根据当前点的位置和步数,计算下一个可能的位置
Point next_pos(Point cur, int step, char dir) {
Point next = cur;
switch (dir) {
case 'L': next.y -= step; break;
case 'R': next.y += step; break;
case 'D': next.x += step; break;
case 'U': next.x -= step; break;
}
return next;
}
// 从起点开始搜索
void bfs(Point start, Point end) {
memset(dist, -1, sizeof(dist));
dist[start.x][start.y] = 0;
QueueElement start_elem = { start, 1 };
enqueue(start_elem);
while (front < rear) {
QueueElement cur_elem = dequeue();
Point cur = cur_elem.pos;
int step = cur_elem.step;
if (cur.x == end.x && cur.y == end.y) {
// 找到了终点,输出路径
printf("%s\n", path[cur.x][cur.y]);
return;
}
for (int s = 1; s <= MAXN; s++) {
for (char dir : "LRDU") {
Point next = next_pos(cur, s, dir);
if (is_valid(next)) {
dist[next.x][next.y] = dist[cur.x][cur.y] + 1;
path[next.x][next.y][dist[next.x][next.y] - 1] = dir;
QueueElement next_elem = { next, s + 1 };
enqueue(next_elem);
}
}
}
}
printf("NO PASS!\n");
}
int main() {
// 读入地图
char line[MAXN + 1];
int n = 0;
while (fgets(line, sizeof(line), stdin) && line[0] != '\n') {
for (int i = 0; i < MAXN; i++) {
map[n][i] = line[i] - '0';
}
n++;
}
// 从左上角到右下角搜索路径
Point start = { 0, 0 };
Point end = { n - 1, MAXN - 1 };
bfs(start, end);
return 0;
}
```
该程序首先读入迷宫地图,然后从左上角开始搜索到右下角的路径。搜索过程中使用BFS算法,记录每个点到起点的最短距离和路径。如果找到了终点,则输出路径字符串;否则输出"NO PASS!"。
阅读全文