演算法 八皇后問題

2021-08-25 11:20:07 字數 1417 閱讀 5191

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

解決方案一:遞迴

思路分析:

定義num來控制皇后的個數,初始設定為8

定義count來計數,計算問題的解決方案總數

定義陣列array[num]來儲存每一組方案的結果

定義查詢方法find(int n),引數n代表當前放的是第幾個皇后,n從0開始

在find中呼叫輸出方法print(),每查詢到一組結果就列印輸出

在find中呼叫判斷方法judge(int n),判斷第n個皇后的當前列和對角線上是否有其它皇后

如果沒有,在find中遞迴查詢下乙個皇后的位置,查詢結束就開始迴圈查詢下一組

最後在main方法中呼叫find方法即可

**實現:

/**

* 八皇后——>n皇后

* 描述:在8x8棋盤放8個皇后,任何乙個皇后都無法直接吃掉其他的皇后,問一共有多少種方法

* @author lousenjay

* */

public class queen

system.out.println();//換行

system.out.println("棋盤展示:");

for (int i = 0; i < num; i++) else

}system.out.println();

} system.out.println(); }

/*** 判斷第n行的皇后在當前列和對角線上是否有皇后

* 如果有則返回false,迴圈下乙個列繼續匹配

* 如果該列符合則返回true,開始下一行查詢

* @param n

* @return

*/private boolean judge(int n)

} return true; }

/*** n代表當前放的是第幾個皇后

* array[n]代表第n個皇后的列的位置

* @param n

*/private void find(int n)

/*開始第一組查詢,先從第一行的8個列開始查詢,符合條件開始依次查詢第二行,

* 八行全部符合條件,查詢結束,計數+1並列印結果

* 不符合就開始查詢第二組

* 最後所有結果全部查詢完畢,跳出遞迴迴圈*/

for (int i = 0; i < num; i++)

} }

public static void main(string args)

}

演算法 八皇后問題

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

演算法 八皇后問題

created by xiaoyu on 2019 10 6.include include using namespace std const int n 8 int board n n int tot 0 int valid int x,int y for int i 0 i x i retur...

八皇后問題(回溯演算法)

八皇后問題是古老的問題,十八世紀由乙個西洋棋手提出的,即在乙個8 8 的西洋棋盤上,放置八個皇后,使它們不能相互攻擊到。即不能處於同一行,同一列,也不能處於同一條斜線上,問有多少種擺法。八皇后問題是經典的回溯演算法問題,後人利用計算機,算出了8 8 的棋盤上能擺出92種,而後又提出了n皇后問題。本人...