遞迴法解決N皇后問題

2021-10-04 19:22:28 字數 984 閱讀 1611

n皇后問題

在乙個n*n的棋盤上面放置n個皇后,要使得任意兩個皇后之間不能相互攻擊,規則是任意兩個皇后處在同一行,同一列或者同一斜線的位置上時,能夠相互攻擊,皇后可以走任意步。

通過分析題目可以知道,若使任意兩個皇后都不能互相攻擊,那麼就必須使得任意兩個皇后不能處在同一行,同一列,同一斜線即可(隱藏條件,皇后不能處在同一點),我們可以把棋盤看成乙個n*n的等差座標系,假設當乙個皇后放在了(i,j)位置上時,那麼i行,j列上的所有左邊都不能再放置新的皇后,同時再所有的經過(i,j)點的斜線也是不能夠放置皇后,行和列好解決,關鍵是如何解決斜線,因為再座標系當中,任意點與其同一斜線上的點所構成的圖形均為正方形,該斜線即為正方形的對角線,那麼根據正方形的性質可知,其四條邊相等,所以可以得到(記斜線上的某一點為(x,y)):(x-i)的絕對值=(y-j)的絕對值,所以這是能否放置皇后的充要條件。

#include#includeint sum=0;

bool pd(int i,int *a)

//條件滿足,返回true代表當前位置可以放置

return true;

}//輸出

void print(int *a,int n)

printf("\n");

} printf("\n");

}int **(int i,int *a,int n) else

**(i+1,a,n);//如果不是最後一行,則行數+1,遞迴繼續執行

} else

//不滿足像左移動一位,接著判斷,因為一維陣列是用來存放列左邊的,所以j+1代表列+1

continue; }}

int main()

八皇后問題,遞迴法

include includeint count 0 成功的次數 判斷在對角線或者同行同列上是否有皇后 int notdanger int row,int j,int chess 8 同列 for int i 0 i 8 i 判斷左上方 for int i row,k j i 0 k 0 i k 判...

n皇后問題 遞迴

遞迴回溯深度優先搜尋解決n皇后問題 用三個陣列b,c,d分別記錄棋盤上的n個列,2n 1個主對角線和2n 1個負對角線的占用情況。用i,j表示皇后所在的行列,同一主對角線上的行列下標的差一樣,若用表示式i j編號,則是 n 1 n 1,所以用表示式i j n對主對角線編號,範圍是1 2n 1 同樣的...

N皇后問題 遞迴

問題 n行n列的棋盤,放n個皇后,問對於給定的n,求出有多少種合法的放置方法。重點 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。否則會發生互相攻擊。思路 1。首先生成map maxn maxn 並對其進行初始化,可以放棋的地方初始化為0 2。每放乙個皇后,這個皇后...