随笔- 509  文章- 0  评论- 151  阅读- 22万 

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 }
复制代码

 

 posted on   zhuli19901106  阅读(302)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示