• 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;
        }
    }
  • 相关阅读:
    汉化DevExpress
    《苹果往事》的台式翻译
    说说《程序员》杂志的排版
    关于量化考核绩效
    as3 浅复制 深复制
    斜视角的讨论(转)
    斜角地图原理解释及斜角图形绘制实例细述(转)
    垃圾回收测试
    Flash务实主义(八)——减少数据传输量(转)
    翻译]游戏主循环
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4150461.html
Copyright © 2020-2023  润新知