2n皇后问题(wustoj-1291)
Description
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
如果你之前熟悉n皇后问题的解法,相信对于2n皇后问题也是很好理解的。如果对于n皇后问题还是不太清楚,那请浏览本人前面的文章,就很清楚n皇后后问题的递归与回溯解法。
对于递归与回溯,原理跟n皇后问题差不多,其难点就在于如何对该棋盘进行既不重复也不遗漏的遍历,还有就是递归的结束条件,这两点在前面的n皇后问题中已经讲解得很透彻。
现在,我们假设你已经对n皇后问题的解法有较为透彻的理解。那么我们就这样摆放皇后:我们先摆放黑皇后(或者先摆放白皇后也可以),我们先定义一个棋盘map_Q[][],从标准输入流中定义,然后我们用两个一维数组posb[i],posw[i]分别表示棋盘的放置黑/白皇后的位置,如posb[i]=j,则表示棋盘上的第i列的黑皇后被放在第j行上。然后,我们同样根据n皇后的算法把所有的黑皇后放置完成,此时,我们在这样的基础上再放置白皇后,原理也跟n皇后的放置一样,只是多了一些判断能否放置的前提条件。当白皇后也完全放置时,结束一次大的递归循环,然后返回到黑皇后的dfs循环里面,在进行又一次大循环。
以下为C++实现的源代码:
#include<cmath>
#includ