编写一个包含三个整数,宽度w
,高度h
和步数的程序或函数s
。您将在一个按像素图像上绘制很长的非自相交随机 s
步长,其中每5 x 5像素单元为空(纯米色)或以下十二个简单“管道”之一:5*w
5*h
上面的图像被放大以显示细节。这是实际尺寸的管道:
(灰色线仅用于分隔管道类型。)
随机游走将是一条连续的管道路径,该路径从一个管道端点(底部四种管道类型之一)开始,到另一个管道端点结束。
从一个空w
的h
网格开始,并随机选择一个单元格作为起点。然后随机选择四个方向之一以开始并绘制相应的管道端点。这个开始的单元格标志着您步行的第一步,每当您绘制一个新的单元格或覆盖一个现有的单元格时,它便被视为采取的另一步骤。
现在,如果选择的方向有效,则反复地随机选择向右,向左或向右走,绘制适当的管单元。回溯并重新选择方向,直到s
形成完整的步阶路径才有效。该路径应以管道端点结尾,该端点可以在网格上的任何位置,具体取决于路径所采用的路线。
重要的是要注意,只有两个直管单元可以被覆盖,并且只能被方向相反的直管单元覆盖,结果是相交单元。否则,必须将所有管道放置在空的单元格中。
绘制相交时,应将路径中距起始像元更远的部分绘制在顶部。
由您决定网格是否具有周期性边界条件(PBC),即,从网格一侧退出的管道是否会从另一侧伸出。如果没有PBC,则网格边界会像其他管道一样成为障碍。
特别案例
其他详情
- 您可能会认为这
s
是最多的,w*h
因此一条路径永远是可能的。(尽管由于相交,可能会有更长的路径。) w
并且h
将始终是积极的。- 所有随机选择都必须一致地随机。例如,即使这样会使问题变得更容易,您也不应避免在可能的情况下进行交叉。允许使用伪随机数生成器。
- 可以使用任何三种视觉上不同的颜色来代替黑色,蓝色和米色。
- 您的输出图像可能会被放大,以使它们实际上是
5*w*k
按5*h*k
像素(其中k
为正整数)表示的。(即使您k
是1,也建议您放大发布的所有示例。) - 可以使用任何常见的无损图像文件格式,并且可以将图像保存到文件,显示或原始输出到stdout。
以字节为单位的最短代码获胜。
例子
(全部放大了500%。)
如果输入为,w=2, h=1, s=0
则输出将始终为:
如果输入是,w=2, h=1, s=1
则输出将是这些图像之一,机会均等:
如果输入为,w=2, h=1, s=2
则输出为
或可能
如果假定网格具有PBC。
以下是w=3, h=2, s=6
假设PBC的一些可能的输出:
w=3, h=3, s=9
假设PBC,这是的可能输出:
请注意,由于相交计算为两个步骤,因此路径不需要覆盖所有像元。同样,我们可以推断出拐角端点是起始像元,因为必须在之后绘制交叉点立交桥。因此,我们可以推断出做出的随机选择的顺序:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
最后,这是w=4, h=5, s=20
和的示例w=4, h=5, s=16
:
You will be drawing a non-self-intersecting random walk
...是自相交还是不相交?