從八皇后問題到2n皇后問題

2021-08-03 21:21:22 字數 1870 閱讀 5255

八皇后問題

在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...