n-皇后問題

題目描述

n-皇后問題是指將 n 個皇后放在 n∗n 的國際象棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。

1_597ec77c49-8-queens.png

現在給定整數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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章