题库首页 › 信息学奥赛 › 题目 12689

完善程序(2) 第6-10题,组合题 (洪水填充)现有用字符标记像素颜色的 8x8 图像。颜色填充的操作描述如下:给定起始像素的位置和待填充的颜色,将起始像素和所有可达的像素(可达的定义:经过一次或多次的向上、下、左、右四个方向移动所能到达且终点和路径上所有像素的颜色都与起始像素颜色相同),替换为给定的颜色。 试补全程序。 01 #include 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 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] = { { 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g' } , 44 { 'g', 'g', 'g', 'g', 'g', 'g', 'r', 'r' } , 45 { 'g', 'r', 'r', 'g', 'g', 'r', 'g', 'g' } , 46 { 'g', 'b', 'b', 'b', 'b', 'r', 'g', 'r' } , 47 { 'g', 'g', 'g', 'b', 'b', 'r', 'g', 'r' } , 48 { 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'r' } , 49 { 'g', 'g', 'g', 'g', 'g', 'b', 'g', 'g' } , 50 { 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'g' } }; 51 52 Point cur(4, 4); 53 char new_color = 'y'; 54 55 flood_fill(image, cur, new_color); 56 57 for (int r = 0; r < ROWS; r++) { 58 for (int c = 0; c < COLS; c++) { 59 cout << image[r][c] << " "; 60 } 61 cout << endl; 62 } 63 // 输出: 64 // g g g g g g g g 65 // g g g g g g r r 66 // g r r g g r g g 67 // g y y y y r g r 68 // g g g y y r g r 69 // g g g y y y y r 70 // g g g g g y g g 71 // g g g g g y y g 72 73 return 0; 74 }

正确答案:完善程序①答案B。is_valid判断,①处应填 image[r][c] == prev_color。

试卷来源:2022 CSP-J入门级(第一轮)C++真题

本卷相关题目

在线做题 同科目题库