遞迴應用 八皇后問題

2021-08-15 03:14:32 字數 2246 閱讀 5726

八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n1×n1,而皇后個數也變成n2。而且僅當 n2 = 1 或 n1 ≥ 4 時問題有解。下圖是乙個八皇后**。

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例同樣利用遞迴演算法也可以求解,今天我們採用遞迴的思想來求解八皇后問題。放第1個皇后時,我們可以在第一行任意位置擺放,放第2個皇后,肯定是在第二行 此時要考慮是否能被第1個皇后攻擊到,也就能否被列攻擊 或者斜線攻擊到,同樣我們擺放第3行的皇后時,也要考慮是否能否被已經擺放好的皇后列攻擊和斜線攻擊到!擺放每一行的皇后,都要考慮,能否被已經擺放好的皇后列攻擊或者斜線攻擊到。難道不可以用遞迴思想嗎當然可以了。我們將n*n的棋盤資料,初始化資料為0,擺放第i行時(i從0開始)第j列(j從0開始),如果該位置是安全的,就將資料置為1,然後繼續擺放第i+1行,這樣遞迴直到,第n行,到第n行 已經把n個皇后擺放ok,列印棋盤

#define _crt_secure_no_warnings

#include static count = 0;//計數

#define rownum 8 //行數量

#define colnum 8 //列數量 可以拓展為n皇后問題

//chess 棋盤現有資料

//row 行下標 0 ~ 7

//col 列下標 0 ~ 7

int issafe(int(*chess)[colnum], int row,int col)

} //因為擺放皇后是從新的一行開始,不存在行攻擊

//斜線攻擊,分左上、右上 能否被攻擊到。沒有左下和右下方,因為後面的皇后棋子還沒開始擺放!

//判斷能否被左上斜線攻擊

for (int i = row - 1, j =col-1; i >= 0 && j >= 0; i--, j--) }

//判斷能否被右上斜線攻擊

for (int i = row - 1, j = col+1; i >= 0 && j < colnum; i--, j++) }

return flag;}/*

在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,

即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

高斯認為有76種方案,高斯 先生也沒有算對的時候!

*///chess 棋盤資料

//row 行下標 0 ~ 7

void eightqueen(int(*chess)[colnum], int row)

;//到row行時的棋盤資料

for (size_t i = 0; i < rownum; i++) }

//row 從0 行到 第 7行

if (rownum == row)//棋盤已經排好完畢,列印棋盤,遞迴函式出口。

printf("\n");

} printf("\n");

} else

//判斷該位置是否合法是否安全,能否被已經擺好的皇后攻擊到。

if (issafe(thiz, row, i))

} }}

int main(int argc, char *argv)

; //從第0行開始遞迴

eightqueen(chess,0);

printf("總共%d種擺放方法。\n",count);

return 0;

}

行列數為1、2、3時無法進行擺放

當行列數n = 4時,也就是四皇后,共2種擺放方式

當行列數n = 8時,也就是八皇后,共92種擺放方式

八皇后問題 遞迴

問題描述 在乙個8 8西洋棋盤上,有8個皇后,每個皇后佔一格 要求皇后間不會出現相互 攻擊 的現象,即不能有兩個皇后處在同一行 同一列或同一對角線上。問共有多少種不同的方法。程式 public void testeightprince 初始化,所有的位置都可以放置乙個皇后 for int x 0 x...

八皇后問題 遞迴

八皇后問題 遞迴 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。8 8的棋盤方格 每一行的某一列上要有乙個皇后 public class eightqueen 左上方 for int i 1 r...

八皇后問題 遞迴

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例.在8x8格的西洋棋上擺放8個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行,同一列或同一斜線上,問有多少中擺法 92 第乙個皇后先放第一行第一列 第二個皇后放在第二行第一列,然後判斷是否ok,如果不ok,繼續放在第二列,第三列,依...