You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

另外我还做了几个小优化:

  1. 调整了move函数的判断顺序,先检查边界,避免越界访问数组,更安全;
  2. 用整行读取的方式读取迷宫,比逐个字符读取更高效,也避免了空格处理的问题;
  3. 增加了起点不存在的判断逻辑,让程序处理更全面。

备注:内容来源于stack exchange,提问作者Darwin Leonard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:37:39