八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是19世紀著名的數學家高斯2023年提出:在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
}public void prt()
system.out.println("");
}system.out.println("");
}/**
* set the queen of line i
* * @param i
*/void qu(int i)
// 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)
}演算法2,也不知道是從**剽竊過來的了,該演算法沒有最終答應出排列組合,僅僅給出有多少種組合,但是演算法確實十分奧妙,提供出來大家分享。
package org.luyang.csdn;
public class queen
} else
sum++;
}public static void main(string args)
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");}}
技術問題兩則
安裝oracle11g時,oracle sid設定成db 254的形式,會導致sqlplus登入時不方便,因此最好設定成export oracle sid db254的形式,以免引起不必要的麻煩。一小兄弟來電詢問,說keepalived做mysql的failover時,vip可以漂移,但mysql程...
技術問題兩則
安裝oracle11g時,oracle sid設定成db 254的形式,會導致sqlplus登入時不方便,因此最好設定成export oracle sid db254的形式,以免引起不必要的麻煩。一小兄弟來電詢問,說keepalived做mysql的failover時,vip可以漂移,但mysql程...
八皇后問題之回溯演算法實現 java實現》
package algorithm public class empress public boolean place int k return true 如果不是與之同一行同一列的或同一斜線上的棋子,返回true public void backtrace int t else public vo...