C 编程 - 检查游戏板的所有有效解决方案

标签 c recursion

好吧,我将用 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/

相关文章:

c - 在华氏、摄氏和开尔文之间转换的程序

c - 这是递归互斥锁的合适用例吗?

c - 如何在 gtk 上添加 text_view 滚动条?

Scala:确保大括号是平衡的

java - 递归:如何尝试整数 1 到 9 的不同组合,以及(部分)反向序列以在出错时重新开始?

python - 如何将多个嵌套字典合并为一个

c - 删除二维数组中的重复字符串值不起作用

c - K&R练习2-5,错误控制可能到达非void函数c的末尾

python 递归元音计数

python - 检查列表是否由其他列表组成