洪水填充(完整代码)CSP-J2022

 题目描述

现有用字符标记像素颜色的 8×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] == prev_color && image[r][c] != new_color);
            
}
//flood 洪水
//fill 填充
void flood_fill(char image[ROWS][COLS], Point cur, int new_color) {
    queue<Point> queue;
    queue.push(cur);
	// 广搜(BFS)
    int prev_color = image[cur.r][cur.c]; // previous,先前的
    image[cur.r][cur.c] = new_color;
    while (!queue.empty()) {
        Point pt = queue.front ();
        queue.pop ();

        Point points[4] = {Point(pt.r + 1, pt.c), 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)) {
                image[p.r][p.c] = new_color;
                // 找到一个,push掉
                queue.push(p);
            }
        }
    }
}
//main(主函数)
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
    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;
}
// 本题较难,不适合蒟蒻们尝试,建议学了两年或以上的大牛们尝试一下!!!

CSP-J2022 是中国计算机学会(China Computer Federation, CCF)主办的全国计算机能力竞赛,是一项面向大学生的计算机科学竞赛。初赛题目以PDF格式发布,PDF是一种跨平台可移植文档格式,可以在不同操作系统和设备上进行查看和打印。初赛PDF包含了竞赛的相关信息,包括竞赛时间、地点、报名要求、参赛资料、题目要求和提交方式等。 CSP-J2022初赛PDF首先会介绍竞赛的背景和目的,对参赛者进行必要的说明。接下来会列出竞赛的各个环节和时间安排,包括笔试、机试等。参赛者需要根据PDF中的要求准备相应的资料,并按照规定的时间和方式提交。 竞赛题目通常会涉及到计算机科学的基础知识和编程能力。PDF中会给出具体的题目要求和答题格式,并提供样例输入输出供参赛者练习。参赛者需要下载并阅读PDF,理解题目要求,并根据要求进行编程实现。提交答案时,需要按照PDF中的指示提交到指定的在线评测系统中进行自动评测。 CSP-J2022 初赛PDF的发布是为了方便参赛者获取竞赛信息和题目要求,帮助参赛者做好充分的准备。参赛者需要仔细阅读PDF,理解竞赛的要求,合理安排学习时间,充分发挥自己的编程能力和思维能力。通过认真准备和实际操作,参赛者有机会在CSP-J2022竞赛中获得优异的成绩,并获得相关的荣誉和奖励。这也有助于提高参赛者的计算机技术水平和解决问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值