问题描述:
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc)
表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor
,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
示例 1:
输入: image = [[1,1,1],[1,1,0],[1,0,1]] sr = 1, sc = 1, newColor = 2 输出: [[2,2,2],[2,2,0],[2,0,1]] 解析: 在图像的正中间,(坐标(sr,sc)=(1,1)), 在路径上所有符合条件的像素点的颜色都被更改成2。 注意,右下角的像素没有更改为2, 因为它不是在上下左右四个方向上与初始点相连的像素点。
注意:
image
和image[0]
的长度在范围[1, 50]
内。- 给出的初始点将满足
0 <= sr < image.length
和0 <= sc < image[0].length
。 image[i][j]
和newColor
表示的颜色值在范围[0, 65535]
内。
解题思路:
常规BFS题目,练手用(又水了一篇博客)
AC代码:
#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int>> GetNeighbor(pair<int, int> &v, vector<vector<int>> &image) {
int x = v.first, y = v.second;
int init_color = image[v.first][v.second];
vector<pair<int, int>> result;
if (x > 0 && init_color == image[x - 1][y]) result.push_back(make_pair(x - 1, y));
if (x < image.size() - 1 && init_color == image[x + 1][y])
result.push_back(make_pair(x + 1, y));
if (y > 0 && init_color == image[x][y - 1]) result.push_back(make_pair(x, y - 1));
if (y < image[0].size() - 1 && init_color == image[x][y + 1])
result.push_back(make_pair(x, y + 1));
return result;
}
// sr代表行, sc代表列
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
// 使用广度优先搜索的策略
queue<pair<int, int>> coords;
set<pair<int, int>> hash;
coords.push(make_pair(sr, sc));
hash.insert(make_pair(sr, sc));
while (!coords.empty()) {
auto v = coords.front();
coords.pop();
auto neighbors = GetNeighbor(v, image);
for (auto neighbor : neighbors) {
if (!hash.count(neighbor)) {
hash.insert(neighbor);
coords.push(neighbor);
}
}
}
cout << hash.size() << endl;
for (auto v : hash) {
image[v.first][v.second] = newColor;
}
return image;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> map;
for (int i = 0; i < n; ++i) {
vector<int> row;
for (int j = 0; j < m; ++j) {
int temp;
cin >> temp;
row.push_back(temp);
}
map.push_back(row);
}
int x, y;
cin >> x >> y;
int color;
cin >> color;
auto ans = floodFill(map, x, y, color);
for (auto row : ans) {
for (auto ele : row) {
cout << ele << " ";
}
cout << endl;
}
return 0;
}