所有组合的二维阵列象棋游戏



我正在制作一个程序,计算一个只有主教和王后的国际象棋游戏的可能解决方案的数量。用户可以输入王后和主教的数量,以及棋盘的大小(行和列(。

我将把董事会中主教和王后的任何一套职位都称为组合。如果所有方块都被攻击,则组合算是一个解决方案(国际象棋统治问题(。

因此,例如,如果用户在5x5棋盘上给出1个女王和3个主教,一个可能的解决方案可以是:

- - B - -
- - - - -
- B Q B -
- - - - -
- - - - -

现在,我在制作一个程序时遇到了困难,该程序可以找到给定片段集的所有可能位置,而没有重复。例如,由于用户可以给出多个主教,因此可能会出现重复。解决方案需要是递归的。

您没有显示当前的解决方案,但我/假设/您为第一块挑选每个正方形,然后为第二块挑选每个方形,如果正方形仍然未被占用,则继续。然后重复第三次等

如果第一块和第二块是相同的类型,那么这将导致重复。第一个棋子在第一个位置,第二个在第二个位置对第一个在第二传位,第二在第一。

如果你有两件相同类型的作品,你可以对第二件作品的定位进行排序:不要把第二件相同的作品放在比第一件更低的索引处。这避免了重复,但仍然访问每一个位置排列。您可以将这种排序强加给更多相同类型的工件。

当您有不同类型的工件时,这两种排序会变得不同。如果第一个和第二个是不同的棋子类型,那么第一个位置的第一个棋子、第二个位置的第二个棋子、第一个位置第一个棋子和第一个位置第二个都是不同的情况。但是,当您放下新类型的第二个实例时,您可以对第一个实例应用排序规则。

【或者,你可以坚持把第二块放在第一块之前——结果是一样的】

作为第二个优化,你可以观察到,如果你有3个主教,第三个必须放在其他2个之后,那么第一个不能放在最后或倒数第二个正方形,所以你可以稍微优化第一个的位置。

当这是第二种类型的作品时,这会变得更加复杂,可能不值得这样做。

第三个优化是保留可用正方形的列表。一旦一件作品被放下,它的正方形就会从列表中删除,所以放置下一件作品的列表会更短,而且当你试图把女王放在主教的身上时,你不必"失败",因为你不会尝试。您可以使用此列表的长度来简化第二次优化。

你可以用std::list::splice做一些聪明的技巧,这意味着当你在片段和位置中递归时,你不会重新分配或复制这个列表。

最新更新