好吧,我将用 C 创建一个代码,输出板的所有可能的解决方案。该板是一个 nxn 板,其中一行看起来像这样(3x3):AA BA BB。
游戏的目标是仅通过垂直或水平穿过棋盘来访问棋盘上的每个位置。另外,如果第一个或第二个字母相同,你只能去下一个位置,所以我可以从 AA 到 BA,但不能从 AA 到 BB,并且你只能访问每个位置一次。起始位置始终是左上角或 00 位置。
无论如何,我想到了一种算法,计算机从 00 开始并检查下一个有效位置,比如说 01。然后计算机使用 00 和 01 链作为起始位置检查所有可能的解决方案。当没有更多的链时,计算机会检查新的链,比如 00、10 等等。你怎么知道不要重复以前的解决方案?我在想一些递归的事情。除了我的算法之外,还有更有效的寻路算法吗?
最佳答案
回复:你怎么知道不要重复以前的解决方案?
深度优先搜索算法的一部分涉及标记访问过的节点,以免两次访问它们。这可以通过多种方式完成:节点本身的备用位,在每次搜索之前初始化,或者正在搜索的图外部的动态集数据结构。
顺便说一下,这个问题与格雷码有关,格雷码是一种排列二进制字代码的方法,使得连续代码之间只有一位发生变化。例如。 000 001 011 010 110 100 101 111。
这意味着在您的棋盘中,当且仅当它是两位格雷码后继或前驱时,您才可以导航到相邻的方 block 。
但是格雷码形成了一个序列。所以这个问题同构于一个问题,其中有一个从 0 到 3 的简单编号,并且允许您从 N 到 N+1 后继者或 N-1 前任者。
这可以帮助你思考问题。
关于C 编程 - 检查游戏板的所有有效解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10082142/