首页 > 代码库 > careercup-递归和动态规划 9.7
careercup-递归和动态规划 9.7
9.7 编写函数,实现许多图片编辑软件都支持的“填充颜色”功能。给定一个屏幕(以二维数组表示,元素为颜色值)、一个点和一个新的颜色值,将新颜色值填入这个点的周围区域,直到原来的颜色值全部改变。
类似leetcode:Surrounded Regions
解法:首先,想象一下这个方法是怎么回事。假设要对一个像素(比如绿色)调用paintFill(也即点击图片编辑软件的填充颜色),我们希望颜色向四周“渗出”。我们会对周围的像素逐一调用paintFill,向外扩张,一旦碰到非绿色的像素就停止填充。
我们使用递归的方法实现这个算法:
#include<vector>#include<iostream>using namespace std;enum Color{Black,White,Red,Yellow,Green};bool Fill(vector<vector<Color> > &board,int x,int y,Color color,Color ncolor){ if(x<0||x>=(int)board.size()||y<0||y>=(int)board[0].size()) return false; if(board[x][y]==color) { board[x][y]=ncolor; Fill(board,x-1,y,color,ncolor); Fill(board,x+1,y,color,ncolor); Fill(board,x,y-1,color,ncolor); Fill(board,x,y+1,color,ncolor); } return true;}bool paintFill(vector<vector<Color> > &board,int x,int y,Color ncolor){ if(board[x][y]==ncolor) return false; return Fill(board,x,y,board[x][y],ncolor);}int main(){ vector<vector<Color> > matrix={ {Color::Green,Color::Green,Color::Black}, {Color::Green,Color::Red,Color::Black}, {Color::Green,Color::Black,Color::Green} }; cout<<paintFill(matrix,0,0,Color::Yellow)<<endl; for(auto m:matrix) { for(auto a:m) cout<<a<<" "; cout<<endl; }}
careercup-递归和动态规划 9.7
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。