下图给出了一个迷宫的平面图,其中标记为黑色的为障碍,标记为白色的为可以通行的区域。迷宫的入口为左上角的黄色方格,出口为右下角的黄色方格。在迷宫中,只能从一个方格走到相邻的上、下、左、右四个方向之一。

发布时间:2024年01月21日

【问题描述】下图给出了一个迷宫的平面图,其中标记为黑色的为障碍,标记为白色的为可以通行的区域。迷宫的入口为左上角的黄色方格,出口为右下角的黄色方格。在迷宫中,只能从一个方格走到相邻的上、下、左、右四个方向之一。

image.png

找到一条从起点到终点的迷宫路径,并将路径输出。如果从起点到终点没有路径,则输出NO PASS!

注:所有迷宫的起点为左上角,终点为右下角。

【输入形式】依次输入n行由0和1构成的字符串,每行字符串长度相同,输入空串结束,其中1表示围墙,0表示可行路径。
【输出形式】如果起点到终点有路,则依次输出由L、R、D、U组成的路径字符串;否则输出NO PASS!。
【样例输入】
0111111
0011101
1001101
0011001
1000111
1110000
【样例输出】
DRDDDRRDRRR

答案:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int count = 0;
#define MAX 120
void dfs(int x, int y, int path_len); // 修改函数参数
int row = 0;
int col = 0;
int **mark = NULL;
int maze[MAX][MAX];
char path[3500];
int shortest_len = MAX * MAX; // 记录最短路径长度
// 定义方向数组 上,下,左,右
int direction[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
// 深度优先搜索数据
int main()
{
? ? char str[MAX + 1];
? ? while (fgets(str, MAX + 2, stdin) != NULL)
? ? {
? ? ? ? if (str[0] == '\n')
? ? ? ? {
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? col = strlen(str) - 1;
? ? ? ? for (int j = 0; j < col; j++)
? ? ? ? {
? ? ? ? ? ? maze[row][j] = str[j] - '0';
? ? ? ? }
? ? ? ? row++;
? ? }
? ? mark = (int **)malloc(row * sizeof(int *));
? ? for (int i = 0; i < row; i++)
? ? {
? ? ? ? mark[i] = (int *)malloc(col * sizeof(int));
? ? ? ? memset(mark[i], 0, col * sizeof(int));
? ? }
? ? mark[0][0] = 1;
? ? dfs(0, 0, 0); // 初始路径长度为0

? ? // 判断是否找到出口
? ? if (count == 0)
? ? {
? ? ? ? printf("NO PASS!\n");
? ? }
? ? free(mark);
? ? system("pause");
? ? return 0;
}

void dfs(int x, int y, int path_len) // 添加path_len参数
{
? ? int p = 0;
? ? if (x == row - 1 && y == col - 1)
? ? {
? ? ? ? count++;
? ? ? ? if (path_len < shortest_len) // 如果当前路径比最短路径更短,则更新最短路径
? ? ? ? {
? ? ? ? ? ? shortest_len = path_len;
? ? ? ? ? ? path[path_len] = '\0'; // 添加字符串结束符
? ? ? ? ? ? printf("%s", path); ? ?// 输出最短路径
? ? ? ? }
? ? ? ? return;
? ? }
? ? else
? ? {
? ? ? ? for (int i = 0; i < 4; i++)
? ? ? ? {
? ? ? ? ? ? int next_x = x + direction[i][0];
? ? ? ? ? ? int next_y = y + direction[i][1];
? ? ? ? ? ? if (next_x < 0 || next_x >= row || next_y < 0 || next_y >= col)
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? if (mark[next_x][next_y] == 1 || maze[next_x][next_y] == 1)
? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? switch (i)
? ? ? ? ? ? {
? ? ? ? ? ? case 0:
? ? ? ? ? ? ? ? path[path_len] = 'U';
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 1:
? ? ? ? ? ? ? ? path[path_len] = 'D';
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 2:
? ? ? ? ? ? ? ? path[path_len] = 'L';
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 3:
? ? ? ? ? ? ? ? path[path_len] = 'R';
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? // 标记当前位置已走过
? ? ? ? ? ? mark[next_x][next_y] = 1;
? ? ? ? ? ? // 继续往下搜索,路径长度加1
? ? ? ? ? ? dfs(next_x, next_y, path_len + 1);
? ? ? ? ? ? // 如果找不到出口则撤销标记
? ? ? ? ? ? mark[next_x][next_y] = 0;
? ? ? ? }
? ? }
}

文章来源:https://blog.csdn.net/2301_80100002/article/details/135721721
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。