用c语言写一个代码【输入形式】依次输入n行由0和1构成的字符串,每行字符串长度相同,输入空串结束,其中1表示围墙,0表示可行路径。 【输出形式】如果起点到终点有路,则依次输出由L、R、D、U组成的路径字符串;否则输出NO PASS!。 【样例输入】 0111111 0011101 1001101 0011001 1000111 1110000 【样例输出】 DRDDDRRDRRR
时间: 2023-12-01 19:03:12 浏览: 73
C语言实现输入一个字符串后打印出该字符串中字符的所有排列
好的,下面是一个用C语言实现的代码,可以实现输入n行由0和1构成的字符串,判断从起点到终点是否有路,并输出由L、R、D、U组成的路径字符串。
```
#include<stdio.h>
#include<string.h>
#define MAXN 1000
int n, m; // n表示迷宫的行数,m表示迷宫的列数
char maze[MAXN][MAXN]; // 迷宫地图
int vis[MAXN][MAXN]; // 记录已经遍历过的节点
const int dx[4] = {0, 0, 1, -1}; // 方向数组,表示上下左右四个方向
const int dy[4] = {1, -1, 0, 0};
char path[MAXN]; // 记录路径字符串
void dfs(int x, int y, int step) // 深度优先遍历
{
if(x == n-1 && y == m-1) // 到达终点,输出路径字符串
{
path[step] = '\0';
printf("%s\n", path);
return;
}
for(int i=0; i<4; i++) // 遍历四个方向
{
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == '0' && !vis[nx][ny]) // 判断是否越界、是否可达、是否已经遍历过
{
vis[nx][ny] = 1; // 标记为已遍历
if(i == 0) path[step] = 'R'; // 记录路径字符串
else if(i == 1) path[step] = 'L';
else if(i == 2) path[step] = 'D';
else path[step] = 'U';
dfs(nx, ny, step+1); // 继续遍历下一个节点
vis[nx][ny] = 0; // 回溯,标记为未遍历
}
}
}
int main()
{
while(scanf("%s", &maze[n]) != EOF) // 不断输入字符串,直到输入空串结束
{
if(strlen(maze[n]) == 0) break;
n++; // 行数加1
m = strlen(maze[0]); // 列数等于第一行的长度
}
memset(vis, 0, sizeof(vis)); // 初始化为未遍历
vis[0][0] = 1; // 标记起点为已遍历
dfs(0, 0, 0); // 从起点开始遍历
if(strlen(path) == 0) printf("NO PASS!\n"); // 如果路径字符串为空,说明没有路
return 0;
}
```
希望能够帮助到您,如有疑问请随时追问。
阅读全文