- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一个迷宫问题,其中迷宫以二维数组表示,因此,如果元素为false,则正方形将无法遍历,反之亦然。我实现了一种求解方法,该方法以深度优先的方式递归尝试遍历起点的所有相邻正方形,该方法应能正常工作。
但是,我想击败DFS算法,我想到了将迷宫简化为图形的想法(也许尝试为边缘分配权重),并在图形上执行DFS,而不是在图中的每个正方形迷宫。我遇到的问题是,我将迷宫变成抓斗的方式似乎效率很低。这是将布尔矩阵变成图形的方法的概述:
我从第0行开始,遍历从索引0、0到索引n,0的每一行,然后从0,1 .. n,1直到n,n。编辑:澄清:我让迷宫的x值先增加。然后,我在下一段中垂直链接节点。
我将矩阵的真值称为空心正方形。
*如果板的边缘上有一个白色正方形,我将在Node类中创建一个新的子类Opening。我将保留对该节点的引用。继续向右,如果我遇到一个十字路口,或者如果下一个正方形是黑色,则在两者之间建立一个节点和一个桥。如果我从一个黑色的正方形过渡到一个白色的正方形,并且如果右边的下一个正方形不是黑色,则创建一个节点,并在该节点和该行的下一个节点之间建立一条边。
将所有节点添加到节点列表中。然后,我遍历(0,0),(0,1),...,(0,n),(1,0),(1,1)..(1,n)的所有列。并在所有未用黑色正方形分隔的节点之间制作边线。
这似乎是处理事情的一种非常昂贵的方法。我很想听听有关如何正确执行此操作的任何建议。
F F F F F F F F F F F F F
T T F T T T T T T T T T F
F T F F F F F F F T F F F
F T T T F T T T F T F T F
F F F T F T F T F F F T F
F T F T F T F T T T T T F
F T F T F T F F F F F F F
F T T T F T T T T T T T F
F T F F F F F F F F F T F
F T F T T T T T T T T T F
F T F T F F F F F F F T F
F T T T F T T T T T T T T
F F F F F F F F F F F F F
. . . . . . . . . . . . .
O O . O . . . . . O . O .
. . . . . . . . . . . . .
. O . O . O . O . . . . .
. . . . . . . . . . . . .
. . . . . . . O . . . O .
. . . . . . . . . . . . .
. O . O . O . . . . . O .
. . . . . . . . . . . . .
. . . O . . . . . . . O .
. . . . . . . . . . . . .
. O . O . O . . . . . O O
. . . . . . . . . . . . .
最佳答案
我有两个解决方案,其中一个已经实施。在我开始解释第一种算法之前,这里要假设该算法所基于的一些假设:
假设条件
就以下方面而言,迷宫是最小的:迷宫的边界砖包含可行走的瓦片T
,或者整个迷宫仅由不可行走的瓦片F
组成。
迷宫定义了一个矩形或换句话说:迷宫的每一行都有相同数量的列。
算法
我将通过使用一个更简单的示例来解释该算法,仍然涉及许多重要情况。考虑以下由5行3列组成的迷宫:
步行瓷砖T
为绿色,而墙面瓷砖F
为蓝色。
该算法的第一阶段从(x,y)=(0,0)开始,通过访问顺时针移动的边界砖来寻找可步行的边界砖。它更喜欢具有少于或多于2个开放边缘的可步行瓷砖。开放边缘是我们知道一个节点但不知道另一个伙伴节点的边缘。
它从图块(x,y)=(0,0)开始,并找到具有2个开放边(以白色箭头表示)的可行走节点。它存储候选节点(用橙色圆圈表示)并继续,以期找到如上所述的首选节点。
在步骤5,找到具有3个开放边缘的由瓦片(2、2)表示的优选节点。它将节点标记为unprocessed
(表示为带有白色或灰色背景的圆圈),并终止第一阶段。
第二阶段将选择一个任意的unprocessed
节点并通过确定开放边缘的伙伴节点对其进行处理,直到不再有unprocessed
节点为止。之后,它将节点标记为processed
。确定伙伴节点可能导致将其他节点标记为unprocessed
。
唯一可以选择的unprocessed
节点是第一阶段中位于(2,2)的边界节点。该算法将其选中(由背景为灰色的圆圈表示)。任意选择的开放边缘表示为灰色箭头(在我们的示例中为南方)。
现在,该算法通过沿walkable
磁贴移动直到找到一个节点(一个边缘少于或多于2个或作为算法开始的磁贴)来搜索伙伴节点。
在我们的案例中,算法在步骤6中找到了可步行图块(0,2)表示的伙伴节点。由于此节点既未标记为processed
也未标记为unprocessed
,因此将其标记为unprocessed
(由具有白色背景的圆圈表示)。现在,开放边缘的伙伴节点为linked
(用黑色箭头表示),反之亦然。
该算法继续选择所选节点的开放边缘,直到所有开放边缘都链接到其伙伴节点。在我们的示例中,下一个任意拾取的开放边指向西。
该算法沿着可步行的图块移动,并找到由图块(0,2)表示的伙伴节点,该结点已在其之前找到并且已标记为unprocessed
。因此,它链接了两个节点的开放边缘,并继续指向北的最后一个开放边缘。
它找到与以前相同的节点,并链接最后一个开放边。现在,在(2,2)处的选定节点不再具有开放的边缘,因此算法将其标记为processed
(由具有绿色背景的圆圈表示)。
该算法继续选择任意一个unprocessed
节点,在(0,2)处找到由图块表示的唯一一个可用节点。但是由于该节点没有任何开放边缘,因此将其立即标记为processed
并继续。
没有更多的unprocessed
节点可用,因此算法终止。
适用于OP示例
如果应用于您提供的示例,则结果图将更小,而不会丢失有关导航迷宫的任何信息。让我们看一下您的图形(由于缺少一些节点,我必须完成它):
左图显示了示例和建议的算法得出的图形。右图显示了我所描述的算法找不到的节点,因为可以在不丢失任何导航信息的情况下对其进行优化。它们要么被边缘取代,要么被完全消除。结果如下所示:
左图显示了替换项,而右图只是其压缩版本。该图从25个节点减少到8个节点,从23个边缘减少到7个边缘。总体上减少了2/3个节点和边缘。
有趣的角落案例
在实施算法时,我发现了一些有趣的特例,我想与您分享。我将匆忙完成算法以保持图像较小。希望您已经了解该算法的工作原理。
单个可行走的瓷砖,因此完全没有边缘:
仅寄宿生砖是可步行的:
所有瓷砖都可以步行:
较好的边界砖具有单边:
关于java - 将 boolean 矩阵转换为图结构的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44072416/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!