【leetcode/BFS】图像渲染(BFS练习)

问题描述:

有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 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;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值