检查所有瓷砖是否已连接

时间:2014-07-10 19:55:25

标签: javascript algorithm

enter image description here

嗨!我有一个有趣的问题。

我在HTML画布中绘制了一系列六边形(忽略点)

对于每个六边形,我都有它的中心的x和y坐标,这就是我识别它们的方式。

我将六边形存储在一个名为六边形的数组中,我存储六边形

    function Hexagon()
    {
        this.shape
        this.x
        this.y
    }

我有一个函数返回一个对象,该对象包含给定六边形的所有相邻六边形

function get_adjacent_hexagons(hexagon)
{
    var x = hexagon.x
    var y = hexagon.y
    var adjacents = []
    for(var i=0; i<editor_hexagons.length; i++)
    {
        if(editor_hexagons[i].x === x && editor_hexagons[i].y == y - (2*s))
        {
            adjacents.push(editor_hexagons[i])
        }
        if(editor_hexagons[i].x === x && editor_hexagons[i].y == y + (2*s))
        {
            adjacents.push(editor_hexagons[i])  
        }
        if(editor_hexagons[i].x === x - (s*1.5) && editor_hexagons[i].y == y - s)
        {
            adjacents.push(editor_hexagons[i])  
        }
        if(editor_hexagons[i].x === x - (s*1.5) && editor_hexagons[i].y == y + s)
        {
            adjacents.push(editor_hexagons[i])  
        }
        if(editor_hexagons[i].x === x + (s*1.5) && editor_hexagons[i].y == y - s)
        {
            adjacents.push(editor_hexagons[i])  
        }
        if(editor_hexagons[i].x === x + (s*1.5) && editor_hexagons[i].y == y + s)
        {
            adjacents.push(editor_hexagons[i])  
        }
    }
    return adjacents
}

根据这些信息,是否可以制作算法来检查所有六边形是否已连接

那就是如果自己没有六边形或六边形组?

例如,在提供的图片中,它们都已连接。

-----编辑-----

这似乎有效

function check_connection()
{
    visited = []
    visit_hexagon(hexagons[0])
}

function visit_hexagon(hexagon)
{
    var not_visited = true
    for(var i=0; i<visited.length; i++)
    {
        if(visited[i] === hexagon)
        {
            not_visited = false
            break
        }
    }
    if(not_visited)
    {
        visited.push(hexagon)
        var adjacents = get_adjacent_hexagons(hexagon)
        for(var i=0; i<adjacents.length; i++)
        {
            visit_hexagon(adjacents[i])
        }
    }
}

2 个答案:

答案 0 :(得分:1)

是。由于您可以找到相邻的六边形,因此可以在地图上创建所有六边形的图形。然后,您可以简单地从图中的单个节点开始执行广度优先搜索,然后检查在搜索结束后是否找到所有节点。有关详细信息,请参阅:https://en.wikipedia.org/wiki/Connectivity_(graph_theory)#Computational_aspects

答案 1 :(得分:1)

首先将节点(六边形)组织成图形结构,其中每个节点都引用其连接的其他节点。将所有节点标记为&#34; unvisited&#34;。从任何节点开始,执行breadthdepth首次搜索,将您找到的每个节点标记为&#34;已访问&#34;。如果在此之后有任何节点没有标记&#34;访问&#34;然后你的图表没有完全连接。