八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
将棋盘的每一行作为搜索树的节点。建立一个数组IsLegal[3][18]分别记录列,主对角线,辅对角线的情况,判段皇后的位置是否合法。
主对角线方向上 col - row + 8 为常数。
辅对角线方向上 col + row 为常数。
#include <iostream>
using namespace std;
int IsLegal[3][18];
int cnt = 0;
void Dfs(int row)
{
if (row == 9)
cnt++;
else {
for(int i = 1; i < 9; i++) {
if(IsLegal[0][i] == 0 && IsLegal[1][row+i] == 0 && IsLegal[2][row-i+8] == 0) {
IsLegal[0][i] = IsLegal[1][row+i] = IsLegal[2][row-i+8] = 1;
Dfs(row + 1);
//回溯,进行状态复原
IsLegal[0][i] = IsLegal[1][row+i] = IsLegal[2][row-i+8] = 0;
}
}
}
}
int main()
{
Dfs(1);
cout << cnt << endl;
return 0;
}