題目描述
n-皇后問題是指將 n 個皇后放在 n∗n 的國際象棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。
現在給定整數n,請你輸出所有的滿足條件的棋子擺法。
輸入格式
共一行,包含整數n。
輸出格式
每個解決方案佔n行,每行輸出一個長度爲n的字符串,用來表示完整的棋盤狀態。
其中”.”表示某一個位置的方格狀態爲空,”Q”表示某一個位置的方格上擺着皇后。
每個方案輸出完成後,輸出一個空行。
數據範圍
1≤n≤9
輸入樣例:
4
輸出樣例:
.Q…
…Q
Q…
…Q.
…Q.
Q…
…Q
.Q…
題解:
經典的n皇后問題:
dfs深搜每一行,用col[J], dg[J], udg[J]數組分別來標記第J列, 正對角線, 反對角線是否有皇后,如果有我們就剪掉, 否則就把皇后放到該位置。
代碼如下:
#include<iostream>
using namespace std;
const int N = 20;
int arr[N][N], col[N], dg[N], udg[N], n;
void dfs(int cur)
{
if(cur == n){ //如果放了n個皇后,直接輸出
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(arr[i][j])cout << 'Q';
else cout << '.';
}
cout << endl;
}
cout << endl;
return ;
}
for(int i = 0; i < n; i++){
if(col[i] || dg[cur + i] ||udg[n - cur + i])continue; //如果有了皇后,剪枝
arr[cur][i] = col[i] = dg[cur + i] = udg[n - cur + i] = 1;
dfs(cur + 1);
arr[cur][i] = col[i] = dg[cur + i] = udg[n - cur + i] = 0; //恢復現場
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}