我正在制作一个程序,该程序仅用主教和皇后来计算国际象棋游戏的可能解法数量。用户可以输入皇后和主教的数量,以及棋盘的大小(行和列)。
我会称呼主教和皇后在董事会上的任何职位组合。如果所有方格都受到攻击(国际象棋统治问题),则将组合视为解决方案。
例如,如果用户在5x5的棋盘上给1个女王和3个主教,则可能的解决方案是:
- - B - -
- - - - -
- B Q B -
- - - - -
- - - - -
现在,我在制作一个程序时会遇到麻烦,该程序可以找到给定的一组零件的所有可能位置,而不会重复。可能会发生重复,因为例如用户可以提供多个主教。该解决方案需要递归。
答案 0 :(得分:0)
您没有显示当前的解决方案,但是我/假设/您为第一块选择了每个正方形,然后为第二块选择了每个正方形,如果正方形仍未被占用,请继续。然后重复第三个,依此类推。
如果第一块和第二块是同一类型,则将导致重复。第一件在第一位置,第二个在第二个位置,第二个在第一位置,在第二个在第二个位置。
如果有两个相同类型的零件,则可以对第二个零件的位置施加一个顺序:不要将第二个相同的零件放置在比第一个零件低的位置。这样可以避免重复,但是仍然可以访问每个位置排列。您可以将此排序强加给更多相同类型的作品。
当您使用不同类型的作品时,这两种顺序将变得不同。如果第一件和第二件是不同的零件类型,则第一件在第一位置,第二件在第二位置,第二件在第一位置,第二件在第一位置是不同的情况。但是,当您放下新类型的第二个实例时,可以对第一个实例应用排序规则。
[或者,您可以坚持将第二块放在第一块之前-结果相同]
作为第二个优化,您可以观察到,如果您有3个主教,并且第三个必须放置在其他2个之后,则第一个不能放置在最后一个或倒数第二个正方形中,因此您可以优化第一个的放置一个非常轻微。
当这是第二种作品时,这变得更加复杂,并且可能不值得这样做。
第三个优化是保留可用正方形的列表。放下一块后,其正方形将从列表中删除,因此列表较短,可以放置下一块,并且当您尝试将女王放置在主教的顶部时,您不必“失败”。你不会尝试的。您可以使用此列表的长度来简化第二次优化。
您可以使用std :: list :: splice进行一些巧妙的技巧,以表示您在遍历各个片段和职位时不会重新分配或重复此列表。