C语言floodFill瓷砖计数代码printf无法输出问题求助
问题定位
代码无法运行到printf输出、运行异常的核心原因有4个:
- 读取平面图字符时使用了错误的格式符
%d:%d用于读取整数,而平面图存储的是#、.、S这类单字符,用%d读取会直接打乱输入流,甚至写入非法内存值导致程序崩溃。 - 缺少
bool类型对应的头文件:C语言原生不支持bool关键字,不引入头文件会直接编译失败,部分编译器隐式处理后会出现不可预知的运行错误。 - 未处理输入残留换行导致读入内容错误:用
scanf读取完N、M两个整数后,输入缓冲区会残留回车符,后续读字符时会直接把这个回车当成平面图内容读入,无法正确识别起点S的坐标。 - 洪水填充逻辑漏处理起点
S导致无限递归:当前逻辑只对.字符做已访问标记,遇到起点S时不会标记,递归过程会反复回到S点重复调用,最终栈溢出导致程序直接崩溃。
修复后可运行代码
#include<stdio.h> #include<stdbool.h> // 引入bool类型所需头文件 char image[1000][1000]; int row,col; int tileCount = 0; bool valid(int i,int j) { if(i<0 || i>=row || j<0 || j>=col) return false; else return true; } void floodFill(int x, int y) { if(valid(x,y) == false) return; if(image[x][y] == '#') return; // 同时处理.和S两种可通行格子,统一标记为已访问 if(image[x][y] == '.' || image[x][y] == 'S'){ image[x][y] = '#'; tileCount++; } floodFill(x-1,y); floodFill(x+1,y); floodFill(x,y-1); floodFill(x,y+1); } int main() { int t; scanf("%d", &t); for(int i=1; i<=t; i++){ tileCount = 0; int x, y; scanf("%d %d", &row, &col); for(int k=0;k<row;k++) { for(int j=0;j<col;j++) { // %c前加空格自动跳过所有空白符(换行、空格),避免读入残留回车 scanf(" %c", &image[k][j]); if(image[k][j] == 'S'){ x = k; y = j; } } } floodFill(x,y); printf("Case #%d: %d\n", i, tileCount); } return 0; }
修改点说明
- 新增
<stdbool.h>头文件,解决bool类型未定义的编译问题。 - 将字符读取的格式符从
%d修改为" %c",格式符前的空格会自动跳过输入流中的换行、空格等空白字符,无需手动调用getchar()吞换行,避免读入无效字符。 - 调整
floodFill的判断逻辑,遇到起点S时和普通瓷砖.一样标记为已访问(设置为#),彻底解决无限递归导致的栈溢出问题。 - 移除了原代码每行读取后多余的
getchar(),避免误吞有效输入字符。
内容的提问来源于stack exchange,提问作者Goldi
相关产品推荐
相关产品推荐

