dfs演算法:皇后問題(按每個元素搜尋)
阿新 • • 發佈:2021-01-28
技術標籤:演算法
n-皇后問題是指將 n 個皇后放在 n∗n 的國際象棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。
現在給定整數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++ ,到下一行;
②xn,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;
}