問題簡述:八皇后問題是乙個以西洋棋為背景的問題:如何能夠在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皇后問題。本人...