Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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

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
Javascript 连接室_Javascript_Algorithm - Fatal编程技术网

Javascript 连接室

Javascript 连接室,javascript,algorithm,Javascript,Algorithm,我已经为我正在进行的一个游戏创建了一个简单的算法,它创建了一个洞穴状的结构。该算法输出一个二维位数组,表示开放区域的位置。例如: 000000000000000000000000 010010000000000111100000 011110000000011111111000 011111110000011111111100 011111111001111111111110 011000000000001111000000 000000000000000000000000 (0表示墙,1表示

我已经为我正在进行的一个游戏创建了一个简单的算法,它创建了一个洞穴状的结构。该算法输出一个二维位数组,表示开放区域的位置。例如:

000000000000000000000000
010010000000000111100000
011110000000011111111000
011111110000011111111100
011111111001111111111110
011000000000001111000000
000000000000000000000000
(0表示墙,1表示开放区域)

问题是,该算法有时会创建一个具有2个非连接部分的洞穴(如上面的示例所示)。我已经编写了一个函数,它为我提供了一个数组,其中包含每个区域的开放点的所有x,y位置

我的问题是,给定一系列包含每个开放区域所有x,y坐标的列表,“连接”这些区域的最快方式是什么?走廊的最小宽度为2毫米

(我是用javascript写的,但即使只是伪代码也能帮我解决这个问题)


我试着比较一个区域中每个点到另一个区域中每个其他点的距离,找到距离最近的两个点,然后从这两个点切割出一条路径,但这种方法是一种减缓速度的方法,我希望有另一种方法。

给定两个洞穴a和B,在a中选择一个点x,在B中选择一个点y(随机选择,两个最近或局部最近的会更好)。在a和B之间钻一条厚度为2的走廊(使用)。如果有多个断开连接的洞穴,则对所有洞穴图的最小生成树的每条边(a,B)进行上述操作(如果选择此边,边权重是要钻的走廊的长度)


编辑编辑:要近似两个洞穴之间的距离,可以使用。它将返回O(n)中凸出洞穴的全局最小值,而不是原始的O(n2)对于非凸洞,进行多次迭代的爬山,随机选择初始猜测。

< P>如果你需要精确的最小解,你可以考虑首先建立洞穴的边界,然后应用O(nm)。算法。这将消除比较洞穴内部点之间距离的需要。然后,一旦知道每对洞穴之间的距离,就构建最小生成树,然后钻取隧道。

由于我从您的描述中知道的不多,我会考虑以下提示:

如何查找最近点对?是否使用简单的蛮力方法,从而获得运行时间
O(n*n)
?还是使用更有效的变体

如果你得到了最近的点,我会用一个简单的方法

另一种方法可能是生成一个只有一个连接区域的结构。因此,可以执行以下操作:首先,取一个随机单元
(x,y)
并将其设置为
1
。然后,您遍历它的所有邻居,并为每个邻居随机将其设置为
1
,或将其保留在
0
。对于设置为
1
的每个单元格,您也可以执行相同的操作,即,您遍历它的邻居并将其随机设置为
1
0
。这保证了您不会遇到任何问题两个独立的区域

确保这一点的算法如下(在python中):

def设置单元(x,y,A):

如果x>=len(A)或y>=len(A[0])或x=len(A[0])或x,请编辑您的问题,将您尝试过的方法和遇到的问题都包括在内。您当前的问题可以重新表述为“这是我的问题,请为我编写代码”,但效果不太好:)
def setCell(x,y,A):
    if x>=len(A) or y>=len(A[0]) or x<0 or y<0:
        return
    A[x][y] = 1

def getCell(x,y,A):
    if x>=len(A) or y>=len(A[0]) or x<0 or y<0:
        return 1
    return A[x][y]

def generate(height, width):
    A = [[0 for _ in xrange(width)] for _ in xrange(height)]
    from random import randint
    import Queue
    (x,y) = (randint(0, height-1), randint(0, width-1))
    setCell (x,y,A)
    q = Queue.Queue()
    q.put((x,y))
    while not q.empty():
        (x,y) = q.get()
        for (nx, ny) in [(x+1,y), (x-1,y), (x,y+1), (x,y-1)]:
            if randint(0,8)<=6:
                if getCell(nx,ny,A)==0:
                    setCell(nx,ny,A)
                    if randint(0,2)<=1:
                        q.put((nx,ny))
    return A

def printField(A):
    for l in A:
        for c in l:
            print (" " if c==1 else "X"), 
        print ""