Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定一个起点(x,y),在像素所在的网格中填充该区域_Java_Algorithm - Fatal编程技术网

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

Java 给定一个起点(x,y),在像素所在的网格中填充该区域,java,algorithm,Java,Algorithm,这是一个电话面试问题,我写了一个解决方案,但它并不能完美地解决问题。我想知道,这个问题有没有简单的解决办法,这是不是一个众所周知的问题。请看下面的问题。首选Java解决方案,伪代码也可以 您将看到一个由黑色或白色的二进制像素组成的矩形网格。 一些像素可能是黑色的,但您最初不知道有多少像素或在哪里 给定一个起点(x,y),填充(即变黑)像素所在的区域。有关示例,请参见下图。“*”表示起点 为了简化工作,您可以在Java中使用以下2d数组 char[][] in={

这是一个电话面试问题,我写了一个解决方案,但它并不能完美地解决问题。我想知道,这个问题有没有简单的解决办法,这是不是一个众所周知的问题。请看下面的问题。首选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', '.'},
            {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}};

带递归解决方案的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条信息,而无需移动指针。