给定起点(x,y),填充像素所在的网格中的区域

时间:2014-09-27 21:17:48

标签: java algorithm

这是一个电话采访问题,我写了一个解决方案,但它并没有完美地解决问题。我想知道,问题是否有任何简单的解决方案,这是一个众所周知的问题。请看下面的问题。 Java中的解决方案是首选,伪代码也没问题。

您将获得一个二进制像素的矩形网格,可以是黑色或白色。 有些像素可能是黑色的,但您最初不知道有多少像素。

给定起始点(x,y),填充(即使黑色)像素所在的区域。请参阅下图中的示例。 " *"正在显示出发点。

* is showing staring point

为了简化您的工作,您可以在Java中使用以下2d数组。

        char[][] in={
            {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
            {'.', 'X', 'X', 'X', '.', '.', 'X', 'X', 'X', '.'},
            {'.', 'X', '.', 'X', 'X', 'X', 'X', '.', 'X', '.'},
            {'.', 'X', '.', '.', '.', '.', '.', '.', 'X', '.'},
            {'.', 'X', '.', '.', '.', '.', '.', '.', 'X', '.'},
            {'.', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '.'},
            {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}};

2 个答案:

答案 0 :(得分:1)

带递归解决方案的Javascript:

var map = [
    ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
    ['.', 'X', 'X', 'X', '.', '.', 'X', 'X', 'X', '.'],
    ['.', 'X', '.', 'X', 'X', 'X', 'X', '.', 'X', '.'],
    ['.', 'X', '.', '.', '.', '.', '.', '.', 'X', '.'],
    ['.', 'X', '.', '.', '.', '.', '.', '.', 'X', '.'],
    ['.', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '.'],
    ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']];

function startFill(map, x, y){
    if (map[y][x] == 'X') {
        return;
    }
    fill(map, x, y);
}

//this does the actual fill logic
function fill(map, x, y) {
    var searchArr = [
        [x - 1, y -1],
        [x, y - 1],
        [x + 1, y -1],
        [x - 1, y],
        [x + 1, y],
        [x - 1, y +1],
        [x, y + 1],
        [x + 1, y + 1]
    ];

    var maxX = map[y].length;
    var maxY = map.length;

    for (var i = 0; i < searchArr.length; i++) {
        var point = searchArr[i];
        var pointX = point[0];
        var pointY = point[1];
        if (pointX >= 0 && pointY >= 0 && pointX < maxX && pointY < maxY && map[pointY][pointX] == '.') {
            map[pointY][pointX] = 'X';
            fill(map, pointX, pointY);
        }
    }
}

startFill(map, 3, 3);

这是我创建的小提琴在屏幕上绘制它: http://jsfiddle.net/sharonamr/dk4vdaj5/

答案 1 :(得分:0)

这是我的python实现(新手)。我在做BFS。

import Queue
import time
class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def getxy(self):
        return self.x,self.y
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    def __hash__(self):
        return hash(self.x+self.y)
def fillPaint(start):
    m = [
    ['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
    ['_', 'X', 'X', 'X', '_', '_', 'X', 'X', 'X', '_'],
    ['_', 'X', '_', 'X', 'X', 'X', 'X', '_', 'X', '_'],
    ['_', 'X', '_', '_', '_', '_', '_', '_', 'X', '_'],
    ['_', 'X', '_', '_', '_', '_', '_', '_', 'X', '_'],
    ['_', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '_'],
    ['_', '_', '_', '_', '_', '_', '_', '_', '_', '_']]
    c = len(m[0])
    r = len(m)

    for i in range(r):
        for j in range(c):
            print m[i][j],
        print ""
    # print r,c
    visited = {}
    visited[start] = True
    q=Queue.Queue()
    q.put(start)
    markPoints = []
    while not q.empty():
        newpoint = q.get()
        x,y = newpoint.getxy()
        # print "EXPLORING FOR ", x,y
        # print ""
        explore=[]
        explore.append(Point(x,y+1))
        explore.append(Point(x+1,y))
        explore.append(Point(x-1,y))
        explore.append(Point(x,y-1))
        for points in explore:
            x,y = points.getxy()
            # print x,y
            if x>=0 and y>=0 and x<r and y<c and m[x][y] == '_' and (points not in visited):
                visited[points] = True
                markPoints.append(points)
                # print "ADDED ", x,y
                q.put(points)
        # print "-----------------------------------------------------------EXPLORE DONE for ",x,y
        # time.sleep(1)
    for i in markPoints:
        x,y = i.getxy()
        m[x][y] = "$" 
    print "AFTER"
    for i in range(r):
        for j in range(c):
            print m[i][j],
        print ""

start = Point(0,0) 
fillPaint(start)