經典n皇后問題java程式碼實現
問題描述:在n*n的二維表格,把n個皇后在表格上,要求同一行、同一列或同一斜線上不能有2個以上的皇后。
例如八皇后有92種解決方案,五皇后有10種解決方案。
public class TestQueen { int n; //皇后的個數 int num = 0; // 記錄方案數 int[] queenCol; // 記錄n個皇后所佔用的列號 boolean[] col; // 列安全標誌 boolean[] diagonal; // 對角線安全標誌 boolean[] undiagonal; // 反對角線安全標誌 public TestQueen(int n) { this.n = n; queenCol = new int[n]; col = new boolean[n]; diagonal = new boolean[2 * n - 1]; undiagonal = new boolean[2 * n - 1]; for (int i = 0; i < n; i++) // 置所有列為安全 col[i] = true; for (int t = 0; t < (2 * n - 1); t++) // 置所有對角線為安全 diagonal[t] = undiagonal[t] = true; } public void run() { solve(0); if (num == 0) { System.out.println(n + "皇后無解!"); } } // 從i行開始,把之後的皇后放好 private void solve(int i) { for (int j = 0; j < n; j++) { if (col[j] && diagonal[i - j + n - 1] && undiagonal[i + j]) { // 表示第i行第j列是安全的可以放皇后(i,j從0開始) queenCol[i] = j; col[j] = false; // 修改安全標誌 diagonal[i - j + n - 1] = false; undiagonal[i + j] = false; if (i < n - 1) // 判斷是否放完n個皇后 { solve(i + 1); // 未放完n個皇后則繼續放後面的 } else // 已經放完n個皇后 { num++; System.out.println("皇后擺放第" + num + "種方案:"); System.out.print("行分別為"); for (int k = 0; k < n; k++) System.out.print(k + " "); System.out.print(" "); System.out.print("列分別為"); for (int k = 0; k < n; k++) System.out.print(queenCol[k] + " "); System.out.print(" "); } col[j] = true; // 修改安全標誌,回溯 diagonal[i - j + n - 1] = true; undiagonal[i + j] = true; } } } public static void main(String[] args) { TestQueen q = new TestQueen(5); q.run(); } }
輸出結果:
皇后擺放第1種方案:
行分別為0 1 2 3 4
列分別為0 2 4 1 3
皇后擺放第2種方案:
行分別為0 1 2 3 4
列分別為0 3 1 4 2
皇后擺放第3種方案:
行分別為0 1 2 3 4
列分別為1 3 0 2 4
皇后擺放第4種方案:
行分別為0 1 2 3 4
列分別為1 4 2 0 3
皇后擺放第5種方案:
行分別為0 1 2 3 4
列分別為2 0 3 1 4
皇后擺放第6種方案:
行分別為0 1 2 3 4
列分別為2 4 1 3 0
皇后擺放第7種方案:
行分別為0 1 2 3 4
列分別為3 0 2 4 1
皇后擺放第8種方案:
行分別為0 1 2 3 4
列分別為3 1 4 2 0
皇后擺放第9種方案:
行分別為0 1 2 3 4
列分別為4 1 3 0 2
皇后擺放第10種方案:
行分別為0 1 2 3 4
列分別為4 2 0 3 1
相關文章
- N皇后問題
- N皇后問題(各種優化)優化
- 八皇后問題分析和實現
- 轉:八皇后問題 java實現,演算法兩則Java演算法
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 八數碼 經典問題
- js解八皇后問題程式碼例項JS
- 回溯法(排列樹)解決八(N)皇后問題
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 【Java】經典示例程式碼Java
- 八皇后問題的錯誤程式碼示範
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- 25道經典Java演算法題(含程式碼)Java演算法
- java經典面試題Java面試題
- 十大經典排序演算法動畫解析和 Java 程式碼實現排序演算法動畫Java
- Java基礎系列22:有關連結串列的經典面試題目解析與程式碼實現Java面試題
- 使用回溯演算法解決N皇后問題以及間隔排列問題演算法
- oracle經典亂碼問題——靠靠靠靠Oracle
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- 經典面試問題:12小球問題演算法(原始碼)面試演算法原始碼
- 經典Java面試題收集Java面試題
- 藍橋杯-N皇后
- 經典排序演算法及其 Java 實現排序演算法Java
- js使用遞迴回溯法解八皇后問題程式碼分享JS遞迴
- java多執行緒總結六:經典生產者消費者問題實現Java執行緒
- 十大經典排序演算法最強總結(含JAVA程式碼實現)排序演算法Java
- Java程式設計師面試時應注意的三個經典問題!Java程式設計師面試
- 70個經典的 Shell 指令碼面試問題指令碼面試
- 四個經典的SQL程式設計問題SQL程式設計
- java經典問題:傳值還是傳引用(轉)Java
- 洛谷八皇后問題
- 經典Java面試題收集(二)Java面試題
- JAVA經典題目彙總Java
- 演算法:N皇后二演算法
- 50道經典的JAVA程式設計題(目錄)Java程式設計
- java經典程式設計題30道題,強烈推薦Java程式設計
- AQS:JAVA經典之鎖實現演算法(一)AQSJava演算法
- 八皇后問題python解法Python