Java與算法之(6) - 八皇後問題
阿新 • • 發佈:2017-05-10
tools trac ava height com 技術分享 false fis light
在8×8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
(文字和圖片來自百度百科)
如果動手來擺放皇後,可以用這樣一種思路:在最左側一列放下一個皇後,然後在右邊一列從上到下找到第一個與左邊皇後不沖突的位置,擺放第二個皇後;再向yo一列,從上到下找到第一個與前兩個皇後不沖突的位置擺放第三個皇後,依次類推,直到在最後一列擺下第八個皇後。
認真思考的話,可以發現這仍然是深度優先搜索的思路,即步步推進,下一步做的事情和當前是一樣的。代碼:
[java] view plain copy print?
- public class DfsEightQueens {
- int[] queens = new int[8]; //記錄每一列皇後的擺放位置
- int count = 0; //擺法總數
- public void dfs(int column) {
- if(column == 8) { //8個皇後都已經擺放
- count++;
- System.out.println("第" + count + "種方法:");
- print();
- return;
- }
- for(int i = 0; i < 8; i++) {
- queens[column] = i; //在該列的第i行上放置皇後
- if(isValid(column)) //檢查擺放在該位置是否與前column-1列的皇後有沖突
- dfs(column + 1); //沒有沖突則開始下一列8個位置的嘗試
- }
- }
- private boolean isValid(int column) {
- for(int i = 0; i < column; i++) { //第column列上的皇後與前面column-1個皇後比較
- if(queens[i] == queens[column]) //兩個皇後在同一行上
- return false;
- if(Math.abs(queens[i] - queens[column]) == (column - i)) //兩個皇後在同一對角線上
- return false;
- }
- return true;
- }
- private void print() {
- for(int i = 0; i < 8; i++) {
- for(int j = 0; j < 8; j++) {
- if(queens[i] == j)
- System.out.print("* ");
- else
- System.out.print("_ ");
- }
- System.out.println();
- }
- }
- public static void main(String[] args) {
- DfsEightQueens q = new DfsEightQueens();
- q.dfs(0);
- System.out.println("共" + q.count + "種擺放方法");
- }
- }
[java] view plain copy print?
- 共92種擺放方法
Java與算法之(6) - 八皇後問題