将2D阵列分成由连续线限定的区域

时间:2018-06-08 00:34:23

标签: arrays algorithm sorting puzzle

我是大学一年级的初学爱好者程序员。最近,我一直沉迷于益智游戏“The Witness”,因为它的极简主义却令人难以置信的难题。作为一个激情项目,我试图重新创建游戏中的Puzzle元素供其他人欣赏。

游戏

This is How the Game Looks So Far

基本上,您有一条由用户控制的白色路径,您必须在网格中导航该路径,将网格划分为由黑色和白色切片组成的区域。每个区域必须只有白色或仅黑色瓷砖。 我已经发布了一张目前为止该项目看起来如何的图片,并解决了这个难题。

问题

我不能为我的生活找出一个将网格分割成区域的功能,如图所示。 Path是路径中每个点的x和y坐标的一维数组。当它完成时,它应该在网格的右上角(cols,rows)。这假设左下角是(0,0)。

Path = [[x1,y1],[x2,y2],...,[cols,rows]]

每个Puzzle都有n行和n列,所以id就像一个函数getRegions(path,cols,rows),它接受路径,行和列,并输出一个这样的数组

arrayWithRegions=
[[2,3,3,2],
 [2,2,2,2],
 [1,1,1,2],
 [1,1,1,2]]

其中每个方块根据路径和外边界设置的边界标记为位于不同的区域。示例是阵列如何在提供的图像中查找拼图。 (无视黑白块,它们现在无关紧要)

我会欣赏任何形式的帮助,甚至是朝着正确方向努力的方向。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用路径线和字段边缘作为边框执行Flood fill algorithm

选择任何未标记的单元格(例如 - 左下角的单元格),使用区域标记1开始填充填充,遍历所有可能的单元格。然后找到另一个未标记的单元格,开始填充区域标记2,依此类推。

FF算法的最简单的递归实现和未标记单元格的顺序搜索应该适用于您的小字段。