#include <stdio.h>
#include <stdlib.h>
int visited[7][14] = {0};
char map[7][14] = {
"AAIAAAAAAAAAA",
"AA AA AAA",
"A A A A",
"AAA AA AA A",
"AA AA A",
"A AAAA AA",
"AAAAAAAAAAOAA"
};
void dfs(int row, int col, char path[], int step)
{
if (row < 0 || row >= 7 || col < 0 || col >= 14)
{
return;
}
if (map[row][col] == 'O')
{
path[step] = '\0';
printf("路径: %s\n", path);
return;
}
if (map[row][col + 1] == ' ' && visited[row][col + 1] == 0)
{
visited[row][col + 1] = 1;
path[step] = 'd';
dfs(row, col + 1, path, step + 1);
visited[row][col + 1] = 0;
}
if (map[row + 1][col] == ' ' && visited[row + 1][col] == 0)
{
visited[row + 1][col] = 1;
path[step] = 's';
dfs(row + 1, col, path, step + 1);
visited[row + 1][col] = 0;
}
if (map[row][col - 1] == ' ' && visited[row][col - 1] == 0)
{
visited[row][col - 1] = 1;
path[step] = 'a';
dfs(row, col - 1, path, step + 1);
visited[row][col - 1] = 0;
}
if (map[row - 1][col] == ' ' && visited[row - 1][col] == 0)
{
visited[row - 1][col] = 1;
path[step] = 'w';
dfs(row - 1, col, path, step + 1);
visited[row - 1][col] = 0;
}
return;
}
int main()
{
char path[10000];
dfs(0, 2, path, 0);
return 0;
}
有个数组越界的问题,在你的dfs函数中,当检查map[row][col + 1]时,会存在请求到数组map的边界之外。所以需要确保col + 1 < 14,膝盖后的代码如下:
#include <stdio.h>
#include <stdlib.h>
int visited[7][14] = {0};
char map[7][14] = {
"AAIAAAAAAAAAA",
"AA AA AAA",
"A A A A",
"AAA AA AA A",
"AA AA A",
"A AAAA AA",
"AAAAAAAAAAOAA"
};
void dfs(int row, int col, char path[], int step)
{
if (row < 0 || row >= 7 || col < 0 || col >= 13) // 修改这里,确保 col + 1 < 14
{
return;
}
if (map[row][col] == 'O')
{
path[step] = '\0';
printf("路径: %s
", path);
return;
}
if (map[row][col + 1] == ' ' && visited[row][col + 1] == 0)
{
visited[row][col + 1] = 1;
path[step] = 'd';
dfs(row, col + 1, path, step + 1);
visited[row][col + 1] = 0;
}
if (map[row + 1][col] == ' ' && visited[row + 1][col] == 0)
{
visited[row + 1][col] = 1;
path[step] = 's';
dfs(row + 1, col, path, step + 1);
visited[row + 1][col] = 0;
}
if (map[row][col - 1] == ' ' && visited[row][col - 1] == 0)
{
visited[row][col - 1] = 1;
path[step] = 'a';
dfs(row, col - 1, path, step + 1);
visited[row][col - 1] = 0;
}
if (map[row - 1][col] == ' ' && visited[row - 1][col] == 0)
{
visited[row - 1][col] = 1;
path[step] = 'w';
dfs(row - 1, col, path, step + 1);
visited[row - 1][col] = 0;
}
return;
}
int main()
{
char path[10000];
dfs(0, 2, path, 0);
return 0;
}
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
引用 皆我百晓生 小程序回复内容作答:
这段代码的目标是寻找迷宫的出口,并输出路径。
代码存在的问题:
修改后的代码如下:
#include <stdio.h>
#include <stdlib.h>
int visited[7][14] = {0};
char map[7][14] = {
"AAIAAAAAAAAAA",
"AA AA AAA",
"A A A A",
"AAA AA AA A",
"AA AA A",
"A AAAA AA",
"AAAAAAAAAAOAA"
};
void dfs(int row, int col, char path[], int step) {
if (row < 0 || row >= 7 || col < 0 || col >= 14) {
return;
}
if (map[row][col] == 'O') {
path[step] = '\0';
printf("路径: %s\n", path);
return;
}
// 标记当前位置已访问
visited[row][col] = 1;
if (map[row][col + 1] == ' ' && visited[row][col + 1] == 0) {
path[step] = 'd';
dfs(row, col + 1, path, step + 1);
}
if (map[row + 1][col] == ' ' && visited[row + 1][col] == 0) {
path[step] = 's';
dfs(row + 1, col, path, step + 1);
}
if (map[row][col - 1] == ' ' && visited[row][col - 1] == 0) {
path[step] = 'a';
dfs(row, col - 1, path, step + 1);
}
if (map[row - 1][col] == ' ' && visited[row - 1][col] == 0) {
path[step] = 'w';
dfs(row - 1, col, path, step + 1);
}
// 取消当前位置的标记
visited[row][col] = 0;
return;
}
int main() {
char path[10000];
dfs(0, 2, path, 0);
return 0;
}
目标是找到从起始点(0, 2)到终点('O')的路径并打印出来。
地图中的字符和行列数必须匹配实际地图。确保在访问数组元素之前,检查行和列的范围是否有效。你的代码中有条件来检查这一点,但请确保它们适用于你的地图。在程序开始时,确保 visited 数组已经初始化为全零,以确保没有意外的访问。确保 path 缓冲区足够大来保存路径。在你的代码中,你使用了 char path[10000],这应该足够。
越界了