1. 程式人生 > 其它 >dfs演算法:皇后問題(按每個元素搜尋)

dfs演算法:皇后問題(按每個元素搜尋)

技術標籤:演算法

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…

下面程式碼按每個元素搜尋,時間複雜度為O(2的n2次),每個位置都有兩種情況,放皇后和不放皇后,總共有n^2個位置;
上一篇文章是按行搜尋,因為事先知道每一行只能放一個皇后,其時間複雜度的為O(n!);更快一些

下面是兩個執行時間比較,按行搜尋快一些

在這裡插入圖片描述
在這裡插入圖片描述

①(yn)表示y在最後一列,即將超出邊界,所以需要更新y = 0,x++ ,到下一行;
②x
n,s==n說明已經放好了n個皇后,表示列舉完 n^2 個了

#include <iostream>
using namespace std;
const int N= 20;
char g[N][N];
bool row[N],rol[N]
,dg[N],udg[N]; int n; void dfs(int x, int y , int s) { if( y == n) y = 0 , x++;//當列到最後一個位置時,換下一行 if(x == n) { if(s==n) { for(int i = 0 ; i < n ; i++) puts(g[i]); puts(""); } return; } //不放皇后 dfs(x ,
y + 1 , s); //放皇后 if(!row[x] && !rol[y] &&!dg[ x + y] && !udg[x - y+ n]) { g[x][y] = 'Q'; row[x] = rol[y] = dg[x + y] = udg[ x - y + n] = true; dfs( x , y + 1 , s + 1); row[x] = rol[y] = dg[x + y] = udg[ x - y + n] = false; g[x][y] ='.'; } } int main() { cin>>n; for(int i = 0 ; i < n ;i++) for(int j = 0 ; j < n ;j++) g[i][j] ='.'; dfs(0,0,0); return 0; }

題目