这是一个电话采访问题,我写了一个解决方案,但它并没有完美地解决问题。我想知道,问题是否有任何简单的解决方案,这是一个众所周知的问题。请看下面的问题。 Java中的解决方案是首选,伪代码也没问题。
您将获得一个二进制像素的矩形网格,可以是黑色或白色。 有些像素可能是黑色的,但您最初不知道有多少像素。
给定起始点(x,y),填充(即使黑色)像素所在的区域。请参阅下图中的示例。 " *"正在显示出发点。
为了简化您的工作,您可以在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', '.'},
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}};
答案 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)