我正在尝试使用递归来解决八皇后问题,但我只是迷路了。
有人可以帮帮我吗?
最佳答案
您的代码有几个错误:
在您的代码中,id
是您要放置在板上的女王的编号。如果在每个步骤中以N
递增该值并从id == 0
开始,则永远无法达到id == N*N - 1
。加1并测试id == N - 1
。
递归时,将放置女王的正方形设置为1,但是从递归返回时,则不将其设置回去。这意味着您需要逐步填补董事会的空白,以便没有有效的举动。您应该在后向调用之后将quare再次设置为0,以使后续的递归不会看到前一个的皇后。
因为您考虑了每个皇后的所有平方*,所以您的有效性检查必须是常规的。仅考虑当前行和列中的所有行和列是不够的。您必须检查所有8行和所有8列。 (*好了,您跳过了前id
行,但是仍然可以将第4个女王/王后放在第7行,将下一个女王/王后放在第5行。)
放置皇后后,您将考虑当前行之后的所有正方形。这不仅浪费,而且还会打印某些解决方案的副本。考虑上面的示例:在第7行有第4号皇后,在第5行有第5号皇后的解决方案与在第5行有第4号皇后并且在第7行有5号皇后的解决方案相同。您的程序将同时打印两者。因此,将大号id
放在行号id
中。 (这意味着您可以在valid
的同一行中跳过对皇后区的测试,但您仍应测试所有列。)
关于c - 使用递归在c中的八个皇后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58073993/