轉:八皇后問題 java實現,演算法兩則
八皇后問題是一個古老而著名的問題,是回溯演算法的典型例題。該問題是19世紀著名的數學家高斯1850年提出:在8×8格的國際象棋盤上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。[英國某著名計算機圖形影像公司面試題]
演算法1:典型的回朔演算法。列印出8皇后的最終排列。
解析:遞迴實現n皇后問題。
演算法分析:
陣列a、b、c分別用來標記衝突,a陣列代表列衝突,從a[0]~a[7]代表第0列到第7列。如果某列上已經有皇后,則為1,否則為0。
陣列b代表主對角線衝突,為b[i-j+7],即從b[0]~b[14]。如果某條主對角線上已經有皇后,則為1,否則為0。
陣列c代表從對角線衝突,為c[i+j],即從c[0]~c[14]。如果某條從對角線上已經有皇后,則為1,否則為0。
package org.luyang.csdn;
public class EightQueue {
String[][] rec = new String[8][8];
int[] a = new int[8];
int[] b = new int[15];
int[] c = new int[15];
int sum;
public EightQueue() {
super();
for (int i = 0; i < this.rec.length; i++) {
for (int j = 0; j < this.rec[i].length; j++) {
this.rec[i][j] = "○";
}
}
}
public void prt() {
System.out.println("");
for (int i = 0; i < this.rec.length; i++) {
for (int j = 0; j < this.rec[i].length; j++) {
System.out.print(this.rec[i][j] + " ");
}
System.out.println("");
}
System.out.println("");
}
/**
* set the queen of line i
*
* @param i
*/
void qu(int i) {
for (int iColumn = 0; iColumn < 8; iColumn++) {
if (a[iColumn] == 0 && b[i - iColumn + 7] == 0
&& c[i + iColumn] == 0) {
// do not conflict
rec[i][iColumn] = "●";
a[iColumn] = 1;
b[i - iColumn + 7] = 1;
c[i + iColumn] = 1;
if (i < 7)
qu(i + 1);
else {
// sysout
prt();
sum++;
}
// whatever how to put the queen, mission is impossible. rollback
rec[i][iColumn] = "○";
a[iColumn] = 0;
b[i - iColumn + 7] = 0;
c[i + iColumn] = 0;
}
}
}
/**
* 8 queen
* @param args
*/
public static void main(String[] args) {
EightQueue eq = new EightQueue();
eq.qu(0);
System.out.println(eq.sum);
}
}
演算法2,也不知道是從哪裡剽竊過來的了,該演算法沒有最終答應出排列組合,僅僅給出有多少種組合,但是演算法確實十分奧妙,提供出來大家分享。
package org.luyang.csdn;
public class Queen {
static int sum = 0, upperlim = 1;
private static void test(int row, int ld, int rd) {
if (row != upperlim) {
int pos = upperlim & ~(row | ld | rd);
while (pos != 0) {
int p = pos & -pos;
pos -= p;
test(row + p, (ld + p) << 1, (rd + p) >> 1);
}
} else
sum++;
}
public static void main(String[] args) {
int n = 8;
if (args.length == 1)
n = Integer.parseInt(args[0]);
long tm = System.currentTimeMillis();
if ((n < 1) || (n > 32)) {
System.out.println(" heh..I can't calculate that.");
System.exit(-1);
}
System.out.println(n + " Queens");
upperlim = (upperlim << n) - 1;
test(0, 0, 0);
System.out.println("Number of solutions is " + sum + ", "
+ (System.currentTimeMillis() - tm) + " milliseconds");
}
}
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/luyang1016/archive/2007/03/01/1517909.aspx
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/220284/viewspace-1023983/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 八皇后問題分析和實現
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 從八皇后問題到回溯演算法演算法
- 洛谷八皇后問題
- 八皇后問題python解法Python
- 八皇后問題自我總結
- 經典n皇后問題java程式碼實現Java
- 八皇后||演算法演算法
- 【演算法】8皇后問題演算法
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- js解八皇后問題程式碼例項JS
- 八皇后問題的錯誤程式碼示範
- 回溯法(排列樹)解決八(N)皇后問題
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 回溯演算法 | 追憶那些年曾難倒我們的八皇后問題演算法
- 演算法學習回顧-皇后問題演算法
- N皇后問題
- 國際象棋“皇后”問題的回溯演算法演算法
- VC實現動畫應用兩則 (轉)動畫
- C#資料結構與演算法系列(十四):遞迴——八皇后問題(回溯演算法)C#資料結構演算法遞迴
- python八皇后Python
- js使用遞迴回溯法解八皇后問題程式碼分享JS遞迴
- mysql問題處理兩則MySql
- 每天刷個演算法題20160519:回溯法解八皇后演算法
- 使用回溯演算法解決N皇后問題以及間隔排列問題演算法
- 力扣演算法經典第一題——兩數之和(Java兩種方式實現)力扣演算法Java
- java web start實現關鍵問題(二) (轉)JavaWeb
- 轉:13球稱重問題Java實現 收藏Java
- 蟻群演算法實現TSP(旅行商)問題(java)演算法Java
- 用 Java 實現的八種常用排序演算法Java排序演算法
- 《演算法》系列—大白話聊分治、回溯,手撕八皇后演算法
- 【演算法資料結構Java實現】Java實現動態規劃(揹包問題)演算法資料結構Java動態規劃
- 用C語言實現八數碼問題C語言
- N皇后問題(各種優化)優化
- 八皇后之回溯法解決
- 蟻群演算法java實現以及TSP問題蟻群演算法求解演算法Java
- Java實現 藍橋杯 演算法提高 八數碼(BFS)Java演算法
- 面試必備:八種排序演算法原理及Java實現面試排序演算法Java