time limit: 10 second
memory limit: 2 mb
在n*n的棋盤上放置n個皇后(西洋棋中的皇后,n≤10)而彼此不受攻擊(即在棋盤的任一行,任一列和任一對角線上不能放置兩個皇后),程式設計求出所有的擺放方法
輸入檔案僅一行,輸入n(0≤n≤10)。
每行輸出一種方案,每種方案按順序輸出皇后所在的列號,各個數之間用空格隔開,若無方案,則輸出「no solution!」。(最後用換行結束)
4
2 4 1 3【題解】3 1 4 2
這題的主要問題在於,要如何判斷當前搜素到的位置能不能放下棋子。
這裡用了3個陣列來解決問題。
zxbo,fxbo,bo;
zxbo陣列和fxbo陣列代表①類。
bo陣列代表②類。
用b[i][j],a[i][j]兩個二維陣列儲存每個位置所代表的類。
其中b[i][j] = i - j;a[i][j] = i + j;
如n = 5 得到的b陣列和a陣列如下。
可以看到b陣列從左上到右下的對角線,數字是一樣的。
而a陣列 從右上到左下的對角線,數字也是一樣的。
我們用fxbo,zxbo分別表示負數和正數的b陣列中的數字是否出現過。
用bo陣列表示a陣列中的數字是否出現過。(a陣列不會出現負數)
然後每次放棋子的時候我們只要看看a[i][j]和b[i][j]的值 m,n。然後看看bo[m] 和 fxbo[n]或zxbo[n] 是否為false,如果為false則表示可以放,否則不能放。
放完後把上面的bo,fxbo或 zxbo陣列置為true;
一行一行的搜尋就好,同時還應該加入乙個lbo陣列,用來判斷列的重複情況。
【**】
#include int a[12][12],b[12][12],n,ans[20],nn = 0; //ans 陣列用於記錄答案,nn整形用於判斷答案數,以此來判斷是否輸出無解資訊。bool zxbo[25],fxbo[25],lbo[12],bo[25];
void init()
void output_ans() //放完所有的棋子,然後輸出答案。
void sear_ch(int x ) //搜尋第x行
for (int i = 1; i <= n;i++) //嘗試每一列
}void s_p()
int main()
N皇后問題
include define maxqueens 20 define minqueens 4 enum bool typedef struct queendata queendata queendata queens maxqueens 1 int ncount init int init chec...
N皇后問題
採用遞迴回溯法 執行結果 輸入8 對於n皇后解的個數,參考 當n 16時,構造法給出解,參考poj 3239 一 當n mod 6 2 且 n mod 6 3時,有乙個解為 2,4,6,8,n,1,3,5,7,n 1 n為偶數 2,4,6,8,n 1,1,3,5,7,n n為奇數 上面序列第i個數為...
N皇后問題
問題 題目 於西洋棋的玩法,因為皇后所在的位置可以縱向 橫向 兩個斜向四個方向的 捕捉 所以8皇后問題就是要求如何布置8個皇后在8 8的棋盤上而使他們互相無法 捕捉 也就是說不存在兩個皇后同行或同列,或在同一斜線上。而n皇后問題就是如何布置n個皇后在n n棋盤裡使不存在兩個皇后在同行同列和同一斜線上...