LintCode -- 1062 · 洪水填充

问题描述:

描述
一张image通过一个2-D整数数组来表示,每一个整数代表图片的像素值(从0到65535)。

给定一个坐标 (sr, sc) 代表洪水填充的起始像素(行和列),以及一个像素颜色newColor,“洪水填充”整张图片。

为了实现一个“洪水填充”,考虑起始像素点,以及与起始像素相同颜色的起始像素4向连接的任何像素,以及与这些像素4向相连的任何像素(同样和起始像素相同颜色),以此类推。把所以之前提到的像素点替换成新的颜色。

最终,返回修改后的图片。

image 和 image[0]的长度会在[1, 50]范围内。
给定的起始像素点会满足 0 <= sr < image.length 和 0 <= sc < image[0].length。
image[i][j]的每一中颜色值和newColor 会是在 [0, 65535]内的整数。

输出样例:

样例 1:

输入:
image = [[1,1],[0,0]]
sr = 0, sc = 0, newColor = 2
输出: [[2,2],[0,0]]
样例 2:

输入:
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]]
解释:
从图片的中心(坐标为(1, 1)),所有和起始像素通过相同颜色相连的像素上成了新的颜色。
注意底下的角落没有被染成2,因为它和起始像素不是4方向相连。

分析:

根据题目描述和样例输出可以总结出来:我们需要将二维数组中心值image[sr][sc]的颜色变成newColor,然后从中心值开始的四个方向也进行newColor的填充;但是4方向的初始值要和中心处的初始值相同的时候才进行4方向的填充,否则就不进行填充了

解决方案:

由于每次都是做相同的操作,所以我第一个想法就是使用递归求解;
先确认递归的结束条件:1.sr代表的是横向坐标(image的长度),后面用x代替,sc代表的是纵向坐标(image[0]的长度),后面用y代替;所以sr<0或者sc<0或者sr>=x或者sc>=y时递归会结束 2.如果四方向的初始值和中心值不同递归结束;给出代码:

public class Solution {
    /**
     * @param image: a 2-D array
     * @param sr: an integer
     * @param sc: an integer
     * @param newColor: an integer
     * @return: the modified image
     */
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        // Write your code here
        int color=image[sr][sc];
        fill(image,sr,sc,newColor,color);
        return image;
    }

    public void fill(int[][] image, int sr, int sc, int newColor,int startColor){
        int x=image.length;
        int y=image[0].length;
        if(sr<0 || sc <0 || sr>=x || sc>=y || image[sr][sc] == newColor || startColor!=image[sr][sc]){
            return;
        }
        image[sr][sc]=newColor;
        fill(image,sr+1,sc,newColor,startColor);
        fill(image,sr-1,sc,newColor,startColor);
        fill(image,sr,sc+1,newColor,startColor);
        fill(image,sr,sc-1,newColor,startColor);
    }
}

AC结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值