八皇后問題
在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法
(方法:遞迴+回溯)
#include
using
namespace
std;
int queen[9];//表示每一行皇后的位置,如:queen[2]=4,表示第2列第4行有乙個皇后
int count = 0;//記錄解的個數
int canplace(int row,int col)//判斷該位置是否可以放皇后
return1;}
void setqueen(int n)//放置皇后}}
}int main()
output
第1種情況
15863724
第2種情況
16837425
第3種情況
17468253
······
第92種情況
84136275
2n皇后問題
問題描述
給定乙個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少種放法?n小於等於8。
輸入格式
輸入的第一行為乙個整數n,表示棋盤的大小。
接下來n行,每行n個0或1的整數,如果乙個整數為1,表示對應的位置可以放皇后,如果乙個整數為0,表示對應的位置不可以放皇后。
輸出格式
輸出乙個整數,表示總共有多少種放法。
樣例輸入
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
樣例輸入
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
#include
#include
using
namespace
std;
int count=0;//記錄解法個數
int chess[9][9];//二維陣列記錄棋盤的情況,1能放,0不能放
int whitequeen[9],blackqueen[9];//存放黑、白皇后每一行的位置
int canplacewhite(int row,int col,int n)//判斷是否能放白皇后
return
1; }
}int canplaceblack(int row,int col,int n)//判斷是否能放黑皇后
return
1; }
}void setblackqueen(int row,int n)//放置黑皇后
else}}
}void setwhitequeen(int row,int n)
else}}
}int main()
}setwhitequeen(1,n);
cout
0;}
解題關鍵:
1.用一維陣列存放皇后的位置,陣列中第i個元素的值代表第i行的皇后位置,回溯後可自動變換位置。若用二維陣列,回溯到上一行時還需將本行皇后位置清除(即標記為1)
2.遞迴思想的運用。把遞迴結束的條件設定到搜尋的最後一步,借用遞迴的特性來回溯。因為合法的遞迴呼叫總是要回到它的上一層呼叫的,那麼在回溯搜尋中,回到上一層呼叫就是回到了前乙個步驟。
八皇后問題 2n皇后問題
問題描述 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處在同一行 同一列或同一斜線上。解決思路 解決八皇后問題不難,主要是應用到了遞迴回溯的方法,本質上也是一種列舉法。從棋盤的第一行開始嘗試擺放第乙個皇后,擺放成功之後,遞迴一層,再遵循規則在棋盤第二行來擺放第二個皇后。如...
八皇后 n皇后 2n皇后
n n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n n 個黑皇后和 n n 個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n n 小於等於 88。輸入的第一行為乙個整數 n n,表示棋盤的大...
n皇后與2n皇后問題
題目 在n n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於再n n的棋盤上放置n個皇后,任何2個皇后不妨在同一行或同一列或同一斜線上。給定棋盤的大小n n 13 輸出整數表示有多少種放置方法 n 8是時輸出92 incl...