C语言运行无结果,找错


#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;
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

引用 皆我百晓生 小程序回复内容作答:
这段代码的目标是寻找迷宫的出口,并输出路径。

代码存在的问题:

  1. 使用的字符常量中没有使用单引号,需要使用单引号括起来,如 'AAIAAAAAAAAAA'。
  2. dfs 函数中没有对当前位置进行标记,需要在进入每个分支之前将当前位置标记为已访问,否则会出现回路。
  3. dfs 函数中没有对当前位置进行取消标记,需要在每个分支的递归返回后将当前位置取消标记,否则会导致下一个分支无法访问当前位置。
  4. 程序中没有判断当前位置是否已访问过,导致可能重复访问同一个位置。

修改后的代码如下:

#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],这应该足够。

越界了