2014-03-20 03:35
题目:实现画图的Flood Fill操作。
解法:DFS和BFS皆可,但BFS使用的队列在时间复杂度上常数项比较大,速度略慢,所以我选了DFS。当然,如果图很大的话DFS是会导致call stack溢出的,那就摊上事儿了。
代码:
1 // 9.7 Implement a flood fill painter that changes a certain area to a certain color. You are given one point as the seed. 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 void floodFill(int i, int j, int n, int m, int new_color, vector<vector<int> > &canva) 7 { 8 int old_color = canva[i][j]; 9 10 canva[i][j] = new_color; 11 if (i >= 1 && old_color == canva[i - 1][j]) { 12 floodFill(i - 1, j, n, m, new_color, canva); 13 } 14 if (i <= n - 2 && old_color == canva[i + 1][j]) { 15 floodFill(i + 1, j, n, m, new_color, canva); 16 } 17 if (j >= 1 && old_color == canva[i][j - 1]) { 18 floodFill(i, j - 1, n, m, new_color, canva); 19 } 20 if (j <= m - 2 && old_color == canva[i][j + 1]) { 21 floodFill(i, j + 1, n, m, new_color, canva); 22 } 23 } 24 25 int main() 26 { 27 int i, j, c; 28 int n, m; 29 vector<vector<int> > canva; 30 31 scanf("%d%d", &n, &m); 32 canva.resize(n); 33 for (i = 0; i < n; ++i) { 34 canva[i].resize(m); 35 } 36 37 for (i = 0; i < n; ++i) { 38 for (j = 0; j < m; ++j) { 39 scanf("%d", &canva[i][j]); 40 } 41 } 42 43 while (scanf("%d%d%d", &i, &j, &c) == 3) { 44 if (i >= 0 && i <= n - 1 && j >= 0 && j <= m - 1) { 45 floodFill(i, j, n, m, c, canva); 46 } 47 for (i = 0; i < n; ++i) { 48 for (j = 0; j < m; ++j) { 49 printf((j == 0 ? "%d" : " %d"), canva[i][j]); 50 } 51 printf("\n"); 52 } 53 } 54 55 for (i = 0; i < n; ++i) { 56 canva[i].clear(); 57 } 58 canva.clear(); 59 60 return 0; 61 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)