(2)(洪水填充)现有用字符标记像素颜色的8x8图像。颜色填充的操作描述如下:给定起始像素的位置和待填充的颜色,将起始像素和所有可达的像素(可达的定义:经过一次或多次的向上、下、左、右四个方向移动所能到达且终点和路径上所有像素的颜色都与起始像素颜色相同),替换为给定的颜色。
01. #include <bits/stdc++.h>
02. using namespace std;
03.
04. const int ROWS = 8;
05. const int COLS = 8;
06.
07. struct Point {
08. int r, c;
09. Point(int r, int c) : r(r), c(c) {}
10. };
11.
12. bool is_valid(char image[ROWS][COLS], Point pt,
13. int prev_color, int new_color) {
14. int r = pt.r;
15. int c = pt.c;
16. return (0 <= r && r < ROWS && 0 <= c && c < COLS &&
17. ① && image[r][c] != new_color);
18. }
19.
20. void flood_fill(char image[ROWS][COLS], Point cur, int new_color) {
21. queue<Point> queue;
22. queue.push(cur);
23.
24. int prev_color = image[cur.r][cur.c];
25. ②;
26.
27. while (!queue.empty()) {
28. Point pt = queue.front();
29. queue.pop();
30.
31. Point points[4] = {③, Point(pt.r - 1, pt.c),
32. Point(pt.r, pt.c + 1), Point(pt.r, pt.c - 1)};
33. for (auto p : points) {
34. if (is_valid(image, p, prev_color, new_color)) {
35. ④;
36. ⑤;
37. }
38. }
39. }
40. }
41.
42. int main() {
43. char image[ROWS][COLS] = {
44. {'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'},
45. {'g', 'g', 'g', 'g', 'g', 'g', 'r', 'r'},
46. {'g', 'r', 'r', 'g', 'g', 'r', 'g', 'g'},
47. {'g', 'b', 'b', 'b', 'b', 'r', 'g', 'r'},
48. {'g', 'g', 'g', 'b', 'b', 'r', 'g', 'r'},
49. {'g', 'g', 'g', 'b', 'b', 'b', 'b', 'r'},
50. {'g', 'g', 'g', 'g', 'g', 'b', 'g', 'g'},
51. {'g', 'g', 'g', 'g', 'g', 'b', 'b', 'g'}};
52.
53. Point cur(4, 4);
54. char new_color = 'y';
55.
56. flood_fill(image, cur, new_color);
57.
58. for (int r = 0; r < ROWS; r++) {
59. for (int c = 0; c < COLS; c++) {
60. cout << image[r][c] << " ";
61. }
62. cout << endl;
63. }
64. // 输出:
65. // g g g g g g g g
66. // g g g g g g r r
67. // g r r g g r g g
68. // g y y y y r g r
69. // g g g y y r g r
70. // g g g y y y y r
71. // g g g g g y g g
72. // g g g g g y y g
73.
74. return 0;
75. }