如何计算多个坐标是否组成一个闭合路径呢


如图,在一个平面上,如何计算黄色区域组成了一个闭合路径呢,功能主要实现建造游戏中,判断墙体是否组成了一个房间。

比较笨的,起点向上下左右四方向格子判断是否有墙,有的话继续遍历下一个相邻墙体的上下左右。最终是否回到起点。

我也这样想,但是性能会很差

就是简单判断周边有没有墙,不会影响性能的。这才哪到哪

每走一步标记周围格子,并蔓延棋盘所有符合条件的格子(可用的格子),每个格子添加标记(可被玩家占据),当一个格子可占据只剩一个玩家时,代表这个格子处于封闭状态(这个时候可以逆推该格子及其周围的格子被包围的墙体),这只是一个思路,我还没做过

这个看起来像是在寻路吧 ? 如果黄色的这个路径都算出来了, 那判断是否闭合不是很简单吗 ?
就看起点终点的坐标是否重合就行了 ?

图论基础之 图中找环_明镜止水之心的博客-CSDN博客_图论找环 建议看看图论算法

肯定是不知道黄色路径的,要自己算

123
添加一个稍微复杂点的,按照原来遍历的思路就走不通了,很难确定围成三个区域

1赞

按这个做了,复杂点的走不通

好的,谢谢

有一个比较快速的方法,你看看能不能参考:
image
–9527是唯一id, --11是权重

1.将每次墙体建造的坐标数据记录,并生成一个唯一id,并设置一个权重,随着墙体的增加权重变大。
2.墙体建造时:

  • 周围不存在其它墙体:在此坐标记录墙体数据,生成唯一id,并设置默认权重。
  • 周围只存在一个墙体(说明是之前的墙体延伸),获取周围墙体唯一id,对应id 权重增加。
  • 周围存在多个墙体:
    1)周围墙体id都不相同,说明没有闭合路径,取权重最大的id,把所有id不同的墙体id统一,权重增加
    2)周围墙体有两个以上id相同,说明有闭合路径,此墙体为闭合点

闭合点产生时,必有闭合路径存在,这时候可以使用保存的坐标,递归获取相邻坐标,反向获取各个坐标,并保存闭合路径的坐标。

如果玩家拆了闭合路径的坐标的墙体,唯一id不用动,权重变就好了,如果不是闭合路径的墙体,就要将这段墙体唯一id做分离了。

感谢,我花时间研究下

https://leetcode.com/problems/detect-cycles-in-2d-grid/
参考这道LeetCode的解答

好的,谢谢

已解决此问题,把思路和方法分享出来,有需要的可以研究下,代码是python写的,后面有空会用ts再写下,同时代码里面还有很多可以优化的。

核心思路:从一个边出发,不断向左或者向右最大角度拐直至找到出发点,就找到了一个最小环,循环遍历所有点就可以找到所有的单眼环。
核心算法问题:1.如何计算向左、向右拐的最大角的点2.如何避免重复找环
算法原理:1.利用两个向量叉乘和点乘的商可以求出一个-pi到pi的弧度,这样就可以计算出一个360°的拐角,求[0,180)的最大角对应的点即可
2.通过矩阵标记已找到环的拐角点,将最大拐角点标记已访问即可,比如圆0-1-2-0,则标记0-1不可再走2这个点findcircle.rar (2.4 KB)

捕获

牛,mark