C / C ++中的数字链接游戏?
游戏-假设一个n×n的正方形阵列。其中,有些正方形是空的,有些是实心的,而一些非实心的正方形是由整数1、2、3,...设置的。每个整数在板上都保持或恰好占据两个不同的正方形。玩家的任务是借助一条仅实现水平和垂直移动的简单路径,将棋盘上每个整数的两次出现连接起来。不允许两条不同的路径相交。路径不能包含任何实心正方形(不允许实心正方形出现在任何路径上)。最后,所有非实心正方形都必须由路径填充。
算法-为了构造一个给定的棋盘尺寸n×n的有效随机拼图,我们首先在棋盘上产生随机的简单的相互不相交的路径。如果在所有生成的路径之外仍保留一些孤立的正方形,请将这些孤立的正方形标记为实心(禁止)。接下来,我们提供路径的端点和实心方块列表作为谜题。
因此,我们首先提出一个解决方案,然后解决该解决方案中的难题。路径和实心正方形将n×n板分开或分隔。我们实现了一个联合查找数据结构来产生该分区。数据结构由板上的n^2正方形集的子集处理。
伪代码
在板上随机放置正方形(a,b)和(c,d),使-
(a,b)和(c,d)是彼此的邻居,并且
(a,b)和(c,d)都不属于迄今为止产生的任何路径。如果在整个板上都找不到这样的正方形对,则返回FAILURE/*这里,(a,b)和(c,d)是要构建的新路径上的前两个正方形。*/
使两个包含(a,b)和(c,d)的联合查找树合并。
只要可以扩展当前路径,请重复-
重命名(a,b)=(c,d)。
找出(a,b)的一个随机相邻的正方形(c,d),使-
(c,d)不属于到目前为止产生的任何路径(包括当前路径)
在部分构造的电流路径上唯一的邻居(c,d)是(a,b)。
如果找不到此类邻居(c,d),则无法进一步扩展路径,因此请中断循环
否则,将(a,b)和(c,d)所属的两个联合查找树合并。
设置在新路径的开始和结束处的两个正方形的端点标志。
返回成功