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。每放乙個皇后,這個皇后...