正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2022 第一轮真题 › 第 43 题
CSP-J 2022 第一轮 第 43 题:洪水填充:④处应填
题目
(洪水填充)
现有用字符标记像素颜色的 $8\times 8$ 图像。颜色填充的操作描述如下:给定起始像素的位置待填充的颜色,将起始像素和所有可达的像素(可达的定义:经过一次或多次的向上、下、左、右四个方向移动所能到达且终点和路径上所有像素的颜色都与起始像素颜色相同),替换为给定的颜色。
试补全程序。
#include<bits/stdc++.h>
using namespace std;
const int ROWS = 8;
const int COLS = 8;
struct Point {
int r, c;
Point(int r, int c): r(r), c(c) {}
};
bool is_valid(char image[ROWS][COLS], Point pt,
int prev_color, int new_color) {
int r = pt.r;
int c = pt.c;
return (0 <= r && r < ROWS && 0 <= c && c < COLS &&
① && image[r][c] != new_color);
}
void flood_fill(char image[ROWS][COLS], Point cur, int new_color) {
queue<Point> queue;
queue.push(cur);
int prev_color = image[cur.r][cur.c];
②;
while (!queue.empty()) {
Point pt = queue.front ();
queue.pop ();
Point points[4] = {③, Point(pt.r - 1, pt.c),
Point(pt.r, pt.c + 1), Point(pt.r, pt.c - 1)};
for (auto p : points) {
if (is_valid(image, p, prev_color, new_color)) {
④;
⑤;
}
}
}
}
int main() {
char image[ROWS][COLS] = {{'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'},
{'g', 'g', 'g', 'g', 'g', 'g', 'r', 'r'},
{'g', 'r', 'r', 'g', 'g', 'r', 'g', 'g'},
{'g', 'b', 'b', 'b', 'b', 'r', 'g', 'r'},
{'g', 'g', 'g', 'b', 'b', 'r', 'g', 'r'},
{'g', 'g', 'g', 'b', 'b', 'b', 'b', 'r'},
{'g', 'g', 'g', 'g', 'g', 'b', 'g', 'g'},
{'g', 'g', 'g', 'g', 'g', 'b', 'b', 'g'}};
Point cur(4, 4);
char new_color = 'y';
flood_fill(image, cur, new_color);
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
cout << image[r][c] << '';
}
cout << endl;
}
//输出:
// g g g g g g g g
// g g g g g g r r
// g r r g g r g g
// g y y y y r g r
// g g g y y r g r
// g g g y y y y r
// g g g g g y g g
// g g g g g y y g
return 0;
}
本小题
④处应填( )
选项
- A. prev_color = image[p.r][p.c]
- B. new_color = image[p.r][p.c]
- C. image[p.r][p.c] = prev_color
- D. image[p.r][p.c] = new_color
答案
D
题解
选 D:image[p.r][p.c] = new_color。
这段程序用广度优先搜索(BFS)进行洪水填充:
- 从起始像素开始,用队列保存待处理的像素。
- 每取出一个像素,就检查它上、下、左、右的邻居
p。 - 如果
p在图像范围内,且颜色与起始像素的原颜色相同,就把它改成新颜色,并加入队列继续搜索。
因此,④处需要将邻居 p 的颜色改为 new_color,⑤处则是 queue.push(p):
``cpp if (is_valid(image, p, prev_color, new_color)) { image[p.r][p.c] = new_color; // ④:染成新颜色 queue.push(p); // ⑤:入队,之后检查它的邻居 } ``
染色也起到了标记“已访问”的作用,避免同一个像素被重复加入队列。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号