2022年CSP-J初赛真题及答案解析(完善程序2)
第 2 题 完善程序(洪水填充)
现有用字符标记像素颜色的 8×88×8 图像。颜色填充的操作描述如下:给定起始像素的位置待填充的颜色,将起始像素和所有可达的像素(可达的定义:经过一次或多次的向上、下、左、右四个方向移动所能到达且终点和路径上所有像素的颜色都与起始像素颜色相同),替换为给定的颜色。
试补全程序。
#include<bits/stdc++.h>usingnamespacestd;constintROWS=8;constintCOLS=8;structPoint{intr,c;Point(intr,intc):r(r),c(c){}};boolis_valid(charimage[ROWS][COLS],Point pt,intprev_color,intnew_color){intr=pt.r;intc=pt.c;return(0<=r&&r<ROWS&&0<=c&&c<COLS&&①&&image[r][c]!=new_color);}voidflood_fill(charimage[ROWS][COLS],Point cur,intnew_color){queue<Point>queue;queue.push(cur);intprev_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(autop:points){if(is_valid(image,p,prev_color,new_color)){④;⑤;}}}}intmain(){charimage[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'}};Pointcur(4,4);charnew_color='y';flood_fill(image,cur,new_color);for(intr=0;r<ROWS;r++){for(intc=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 greturn0;}①~⑤处应填( )
- A. image[r][c] == prev_color
B. image[r][c] != prev_color
C. image[r][c] == new_color
D. image[r][c] != new_color - A. image[cur.r+1][cur.c] = new_color
B. image[cur.r][cur.c] = new_color
C. image[cur.r][cur.c+1] = new_color
D. image[cur.r][cur.c] = prev_color - A. Point(pt.r, pt.c)
B. Point(pt.r, pt.c+1)
C. Point(pt.r+1, pt.c)
D. Point(pt.r+1, pt.c+1) - 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 - A. queue.push( p)
B. queue.push(pt)
C. queue.push(cur)
D. queue.push(Point(ROWS, COLS))
答案:
- A
- B
- C
- D
- A
解析:洪水填充:is_valid 判断像素颜色等于原始颜色且不等于新颜色,故①为image[r][c] == prev_color。开始填充前先把起始点颜色改为新颜色,故②为image[cur.r][cur.c] = new_color。四个方向包括上、下、左、右,数组 points 的第一个应为下(行+1),即Point(pt.r+1, pt.c),故③选 C。每访问一个有效点将其颜色改为新颜色,故④为image[p.r][p.c] = new_color,然后入队,⑤为queue.push(p)。
更多内容请关注专栏:信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}