3.1 N 皇后问题
【问题描述】在国际象棋中,皇后可以攻击与她在同一条水平线、垂直线和对角线的棋子。现在有一张 N×N
的国际象棋棋盘,在上面放置 N 个皇后。有多少种使皇后不能互相攻击的方案?(N≤13)
(1) 深度优先搜索(DFS)
逐列(行)搜索。每测试一个位置,就检查它是否与其他皇后冲突,如果冲突,回溯①。
每放置一个皇后,就要记录——所在列、“/”对角线和“\”对角线都不能放皇后了。
#include <iostream>
#include <cstring>
using namespace std;
bool column[20],cross1[50],cross2[50];
int pos[20];
int n, sum=0;
void dfs(int row)
{
if (row==n)
{
sum++;
return;
}
for (int i=0;i<n;i++)
if (!(column[i] || cross1[row-i+n] || cross2[row+i])) // 判断是否可以放置皇后
{
// 对皇后已经控制的列和对角线做标记
column[i]=cross1[row-i+n]=cross2[row+i]=true;
pos[row]=i;
dfs(row+1);
// 解除标记,这样才能在新位置上放置皇后。
column[i]=cross1[row-i+n]=cross2[row+i]=false;
}
}
int main()
{
cin>>n;
memset(column,0,sizeof(column));
memset(cross1,0,sizeof(cross1));
me