Java 给定一个起点(x,y),在像素所在的网格中填充该区域
这是一个电话面试问题,我写了一个解决方案,但它并不能完美地解决问题。我想知道,这个问题有没有简单的解决办法,这是不是一个众所周知的问题。请看下面的问题。首选Java解决方案,伪代码也可以 您将看到一个由黑色或白色的二进制像素组成的矩形网格。 一些像素可能是黑色的,但您最初不知道有多少像素或在哪里 给定一个起点(x,y),填充(即变黑)像素所在的区域。有关示例,请参见下图。“*”表示起点 为了简化工作,您可以在Java中使用以下2d数组Java 给定一个起点(x,y),在像素所在的网格中填充该区域,java,algorithm,Java,Algorithm,这是一个电话面试问题,我写了一个解决方案,但它并不能完美地解决问题。我想知道,这个问题有没有简单的解决办法,这是不是一个众所周知的问题。请看下面的问题。首选Java解决方案,伪代码也可以 您将看到一个由黑色或白色的二进制像素组成的矩形网格。 一些像素可能是黑色的,但您最初不知道有多少像素或在哪里 给定一个起点(x,y),填充(即变黑)像素所在的区域。有关示例,请参见下图。“*”表示起点 为了简化工作,您可以在Java中使用以下2d数组 char[][] in={
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', '.'},
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}};
带递归解决方案的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);
var映射=[
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
[','X','X','X','X','X','X','X','X','X',',
[','X',','X','X','X','X','X','X','X','X','X','X'.],
['、'X'、'、'、'、'、'、'、'、'、'、'、'、'X'、'.'],
['、'X'、'、'、'、'、'、'、'、'、'、'、'、'X'、'.'],
[','X','X','X','X','X','X','X','X','X','X','X',',
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']];
函数开始填充(映射,x,y){
if(映射[y][x]='x'){
返回;
}
填充(地图,x,y);
}
//这不符合实际的填充逻辑
函数填充(映射,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]。长度;
var maxY=map.length;
对于(变量i=0;i=0&&pointY>=0&&pointX
这是我在屏幕上绘制的小提琴:
这是我的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)
导入队列
导入时间
类点():
定义初始化(self,x,y):
self.x=x
self.y=y
def getxy(自身):
返回self.x,self.y
定义(自身、其他):
返回self.x==other.x和self.y==other.y
定义散列(自我):
返回散列(self.x+self.y)
def fillPaint(开始):
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”、“X”、“X”、“X”、“X”],
[UUX'、''UX'、''UU'、''UU'、''UU'、''UU'、''UU'、''UX'、''UU'],
[UUX'、''UX'、''UU'、''UU'、''UU'、''UU'、''UU'、''UX'、''UU'],
[“X”,“X”,“X”,“X”,“X”,“X”,“X”,“X”,“X”,“X”,“X”,“X”,“X”,“X”],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_']]
c=len(m[0])
r=len(m)
对于范围(r)内的i:
对于范围(c)内的j:
打印m[i][j],
打印“”
#打印r,c
访问={}
已访问[开始]=真
q=队列。队列()
q、 放(开始)
标记点=[]
而不是q.empty():
newpoint=q.get()
x、 y=newpoint.getxy()
#打印“探索”,x,y
#打印“”
探索=[]
explore.append(点(x,y+1))
explore.append(点(x+1,y))
explore.append(点(x-1,y))
explore.append(点(x,y-1))
有关探索中的要点:
x、 y=点。getxy()
#打印x,y
如果x>=0且y>=0且xMy作业更轻松?工作报酬是多少?和Wtf一样@艾伦·图灵无法解决这个问题??:)谢谢你的解决方案。基本上,您是在当前点周围搜索并填充Xs。在每次尝试中,您都在移动前使用searchArr。我认为它不满足以下条件:“一些像素可能是黑色的,但您最初不知道有多少像素或在哪里”。在您的情况下,在移动指针之前,您正在搜索并找出当前点周围存在的内容。问题是,你将指针向左、向右、向上和向下移动,并在每次尝试中找出一条信息。您正在使用searchArr查找8条信息,而无需移动指针。