N皇后
问题描述
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
问题分析
我们按行来摆放棋子,每一行都会有N种摆放方法,这样分析下去,每一种情况共同构造出了一棵树.
所以可以用dfs来解这个题.
题解代码
数据结构的设计
首先棋盘的设计不是一个二维数组;;而是一个一维数组:: 下标代表是哪一行,存储的值代表这一行的皇后在哪一列.
代码实现
#include <iostream>
using namespace std;
const int N=12;
int col[N];
int cnt;
int n;
bool check(int r,int l){
for(int i=1;i<r;i++){
if(col[i]==l){
return false;
}
else if(abs(col[i]-l)==abs(r-i)){
return false ;
}
}
return true;
}
void DFS(int r){
if(r>=n){
cnt++;
}
for(int i=1;i<=n;i++){
if(check(r+1,i)){
col[r+1]=i;
DFS(r+1);
}
}
}