剑指Offer----面试题28----扩展:八皇后问题

来源:互联网 发布:淘宝充错话费追回流程 编辑:程序博客网 时间:2024/06/03 11:29

题目:


在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法?




分析:

由于八个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。先把ColumnIndex的八个数字分别用0-7初始化,接下来我们要做的事情就是对数组ColumnIndex做全排列。由于我们是用不同的数字初始化数组中的数字,因此任意两个皇后肯定不同列。我们只需要判断得到的每一个排列对应的八个皇后是不是在同一对角斜线上,也就是数组的两个下标i和j,是不是i-j==ColumnIndex[i]-Column[j]或者j-i==ColumnIndex[i]-ColumnIndex[j]。

源代码如下:

#include<iostream>using namespace std;int g_number = 0;void Permutation(int *, int, int);void Print(int *, int);void EightQueen(){const int queens = 8;//八皇后问题int ColumnIndex[queens];for (int i = 0; i < queens; ++i)ColumnIndex[i] = i;    //初始化Permutation(ColumnIndex, queens, 0);}bool Check(int ColumnIndex[], int length){int i, j;for (i = 0; i < length; ++i){for (j = i + 1; j < length; ++j){if (i - j == ColumnIndex[i] - ColumnIndex[j] || j - i == ColumnIndex[i] - ColumnIndex[j])   //在正、副对角线上return false;}}return true;}void Permutation(int ColumnIndex[], int length, int index){if (index == length){if (Check(ColumnIndex, length))   //检测棋盘当前的状态是否合法{++g_number;Print(ColumnIndex, length);}}else{for (int i = index; i < length; ++i)   //全排列{swap(ColumnIndex[index], ColumnIndex[i]);Permutation(ColumnIndex, length, index + 1);swap(ColumnIndex[index], ColumnIndex[i]);}}}void Print(int ColumnIndex[], int length){printf("%d\n", g_number);for (int i = 0; i < length; ++i)printf("%d ", ColumnIndex[i]);printf("\n");}int main(void){EightQueen();system("pause");return 0;}

运行结果:
10 4 7 5 2 6 1 320 5 7 2 6 3 1 430 6 3 5 7 1 4 240 6 4 7 1 3 5 251 3 5 7 2 0 6 461 4 6 3 0 7 5 271 4 6 0 2 7 5 381 5 0 6 3 7 2 491 5 7 2 0 3 6 4101 6 2 5 7 4 0 3111 6 4 7 0 3 5 2121 7 5 0 2 4 6 3132 0 6 4 7 1 3 5142 4 1 7 0 6 3 5152 4 1 7 5 3 6 0162 4 6 0 3 1 7 5172 4 7 3 0 6 1 5182 5 3 0 7 4 6 1192 5 3 1 7 4 6 0202 5 1 4 7 0 6 3212 5 1 6 4 0 7 3222 5 1 6 0 3 7 4232 5 7 1 3 0 6 4242 5 7 0 4 6 1 3252 5 7 0 3 6 4 1262 6 1 7 4 0 3 5272 6 1 7 5 3 0 4282 7 3 6 0 5 1 4293 1 4 7 5 0 2 6303 1 6 4 0 7 5 2313 1 6 2 5 7 0 4323 1 6 2 5 7 4 0333 1 7 4 6 0 2 5343 1 7 5 0 2 4 6353 0 4 7 5 2 6 1363 0 4 7 1 6 2 5373 5 0 4 1 7 2 6383 5 7 1 6 0 2 4393 5 7 2 0 6 4 1403 6 2 7 1 4 0 5413 6 0 7 4 1 5 2423 6 4 2 0 5 7 1433 6 4 1 5 0 2 7443 7 0 2 5 1 6 4453 7 0 4 6 1 5 2463 7 4 2 0 6 1 5474 1 3 5 7 2 0 6484 1 3 6 2 7 5 0494 1 5 0 6 3 7 2504 1 7 0 3 6 2 5514 2 0 5 7 1 3 6524 2 0 6 1 7 5 3534 2 7 3 6 0 5 1544 0 3 5 7 1 6 2554 0 7 3 1 6 2 5564 0 7 5 2 6 1 3574 6 3 0 2 7 5 1584 6 0 3 1 7 5 2594 6 0 2 7 5 3 1604 6 1 3 7 0 2 5614 6 1 5 2 0 3 7624 6 1 5 2 0 7 3634 7 3 0 2 5 1 6644 7 3 0 6 1 5 2655 1 6 0 3 7 4 2665 1 6 0 2 4 7 3675 2 4 6 0 3 1 7685 2 4 7 0 3 1 6695 2 0 6 4 7 1 3705 2 0 7 4 1 3 6715 2 0 7 3 1 6 4725 2 6 3 0 7 1 4735 2 6 1 3 7 0 4745 2 6 1 7 4 0 3755 3 1 7 4 6 0 2765 3 0 4 7 1 6 2775 3 6 0 2 4 1 7785 3 6 0 7 1 4 2795 0 4 1 7 2 6 3805 7 1 3 0 6 4 2816 1 3 0 7 4 2 5826 1 5 2 0 3 7 4836 2 0 5 7 4 1 3846 2 7 1 4 0 5 3856 3 1 4 7 0 2 5866 3 1 7 5 0 2 4876 4 2 0 5 7 1 3886 0 2 7 5 3 1 4897 1 3 0 6 4 2 5907 1 4 2 0 6 3 5917 2 0 5 1 4 6 3927 3 0 2 5 1 6 4请按任意键继续. . .


0 0