C语言Flood Fill迷宫通路判断程序故障排查求助
C语言Flood Fill迷宫通路判断程序故障排查求助
你好,我看了你的代码,发现几个明显的问题,正是这些问题导致程序无法正常运行,下面一一给你说明:
函数递归调用参数错误:你的
move函数定义的第三个参数是size,但在函数内部递归调用的时候,却传了length和width这两个根本没定义的变量!这会直接导致编译错误,就算侥幸编译通过,运行时也会出现未定义行为,这是最核心的问题。你应该把所有递归调用的第三个参数改成size,比如move(y + 1, x, size);。起点记录逻辑的潜在问题:你现在遍历迷宫时,每次遇到
O就更新y和x,这意味着如果迷宫里有多个O,最后只会把最后一个O当作起点。如果你的需求里迷宫只有一个起点,这个逻辑没问题,但最好给起点变量初始值(比如-1),最后判断是否找到起点,避免没有O时程序崩溃。未显式初始化访问标记数组:虽然全局数组
passed默认会被初始化为false,但显式初始化会让代码更健壮,避免因为编译器差异出现意外问题。
下面是修复并优化后的代码:
#include <stdio.h> #include <stdbool.h> #define MAX 1001 char maze[MAX][MAX]; bool passed[MAX][MAX]; void move(int y, int x, int size) { // 先判断边界,越界直接返回,避免访问非法数组元素 if (y < 0 || x < 0 || y >= size || x >= size) return; // 再判断是否是障碍物或已访问 if (maze[y][x] == '#' || passed[y][x]) return; passed[y][x] = true; // 四个方向递归探索,参数修正为size move(y + 1, x, size); move(y - 1, x, size); move(y, x + 1, size); move(y, x - 1, size); } int main() { int size; scanf("%d", &size); // 初始化起点为无效值,方便后续判断是否找到起点 int start_y = -1, start_x = -1; // 显式初始化passed数组为未访问状态 for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { passed[i][j] = false; } } // 读取迷宫,整行读取更高效,避免逐个字符的空格问题 for (int i = 0; i < size; i++) { scanf("%s", maze[i]); for (int j = 0; j < size; j++) { if (maze[i][j] == 'O') { start_y = i; start_x = j; } } } // 如果没找到起点,直接输出No if (start_y == -1 || start_x == -1) { printf("No\n"); return 0; } move(start_y, start_x, size); // 判断右下角是否被访问到 if (passed[size - 1][size - 1]) { printf("Yes\n"); } else { printf("No\n"); } return 0; }
另外我还做了几个小优化:
- 调整了
move函数的判断顺序,先检查边界,避免越界访问数组,更安全; - 用整行读取的方式读取迷宫,比逐个字符读取更高效,也避免了空格处理的问题;
- 增加了起点不存在的判断逻辑,让程序处理更全面。
备注:内容来源于stack exchange,提问作者Darwin Leonard
相关产品推荐
相关产品推荐

