c_cpp FloodFill
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp FloodFill相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
using namespace std;
bool isValid(int x, int y, vector<vector<int>> image,int startColor){
if(x<0 || y<0 || x>=image.size() || y>=image[0].size()
|| image[x][y]!=startColor)
{
return false;
}
return true;
}
void DFS(vector<vector<int>> &image, map<pair<int,int>,bool > visited,
int x, int y, int startColor,int newColor)
{
visited[{x,y}]=true;
image[x][y]=newColor;
vector<int> var={-1,1}; // variations;
for(int i=0;i<2;i++){ // left,right
int newY=y+var[i];
if(isValid(x,newY,image,startColor) && !visited[{x,newY}]){
DFS(image,visited,x,newY,startColor,newColor);
}
}
for(int i=0;i<2;i++){ // up,down
int newX=x+var[i];
if(isValid(newX,y,image,startColor) && !visited[{newX,y}]){
DFS(image,visited,newX,y,startColor,newColor);
// for connected component for source
}
}
}
vector<vector<int>> floodFill(vector<vector<int>> image, int sr, int sc, int newColor) {
int startColor=image[sr][sc];
int r=image.size();
int c=image[0].size();
map<pair<int,int>,bool > visited;
DFS(image,visited,sr,sc,startColor,newColor);
return image;
}
int main(){
freopen("ip.txt","r",stdin);
int t;
cin>>t;
while(t--){
int r,c;
cin>>r>>c;
vector< vector<int> > image(r);
for(int i=0;i<r;i++){
image[i].resize(c);
for(int j=0;j<c;j++){
cin>>image[i][j];
}
}
int sr,sc;
cin>>sr>>sc;
int newColor;
cin>>newColor;
vector<vector<int> > ans=floodFill(image,sr,sc,newColor);
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
}
}
以上是关于c_cpp FloodFill的主要内容,如果未能解决你的问题,请参考以下文章
[FloodFill] aw1097. 池塘计数(bfs+dfs+FloodFill+模板题)
[FloodFill] aw1106. 山峰和山谷(bfs+FloodFill+模板题)
floodfill
Floodfill算法——求独立子图个数
opencv —— floodFill 漫水填充,证件照换背景
UVA12171-Sculpture(离散化+floodfill)