八皇后问题
在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一条对角线上。请问总共有多少种符合条件的摆法?
思路
剑指offer上的方法,通过排列组合求出所有不在同一行、同一列的组合,然后剔除在同一对角线的组合,即为最终结果
定义一个数组ivec[8],数组中第i个数字表示位于第i行的皇后的列号,先把数组ivec中的8个数字分别用0-7初始化,然后对数组ivec进行全排列,因为我们用不同的数字初始化数组,所以任意两个皇后肯定不同列。接下来只需要判断每一个排列对应的8个皇后是不是在同一条对角线上,也就是对于数组的两个下标i,j,如果存在 (abs(i-j)) == (abs(ivec[i]-ivec[j])),则剔除。否则为其中一种摆法。
代码
|
|
结果
解法共有92种,时间复杂度为 8! ((8 7)/2)。8!为排列组合需要的时间复杂度,(8 * 7)/2 为剔除每一个排列组合需要的时间复杂度。