import java.util.HashMap; import java.util.Map; /** * 八皇后问题 * * @author Watson Xu * @since 2016年4月8日 v1.0.0 */ public class Queens { private Integer queens; // 同栏是否有皇后,1表示有 private Integer[] column; // 右上至左下是否有皇后 private Integer[] rup; // 左上至右下是否有皇后 private Integer[] lup; // 解答 private Integer[] queen; // 独立解 及其对称图形 private Map<String, String> results = new HashMap<String, String>(); // 解答编号 private int num; public Queens(int queens) { this.queens = queens; column = new Integer[queens + 1]; rup = new Integer[(2 * queens) + 1]; lup = new Integer[(2 * queens) + 1]; queen = new Integer[queens + 1]; for (int i = 0; i <= queens; i++) { column[i] = queen[i] = 0; } for (int i = 0; i <= (2 * queens); i++) { rup[i] = lup[i] = 0; // 初始定义全部无皇后 } } public void backtrack(int i) { if (i > queens) { showAnswer(); } else { for (int j = 1; j <= queens; j++) { if ((column[j] == 0) && (rup[i + j] == 0) && (lup[i - j + queens] == 0)) { // 若无皇后 queen[i] = j; // 设定为占用 column[j] = rup[i + j] = lup[i - j + queens] = 1; backtrack(i + 1); // 循环调用 column[j] = rup[i + j] = lup[i - j + queens] = 0; } } } } protected void showAnswer() { num++; if(!isIndependence(num)) return; System.out.println("解答" + num + ":"); for (int y = 1; y <= queens; y++) { for (int x = 1; x <= queens; x++) { if (queen[y] == x) { System.out.print(" Q"); } else { System.out.print(" ."); } } System.out.println(" "); } System.out.println(); } protected boolean isIndependence(int number) { // 自身 String newSolution = resultToString(queen); String flag = results.get(newSolution); if (flag != null) { //System.out.println("非独立解答解答, 同解答 " + flag + " 对称。"); return false; } // 左右对称 Integer[] leftRight = new Integer[queen.length]; // 上下对称 Integer[] upDown = new Integer[queen.length]; // 左上右下对称 Integer[] lurd = new Integer[queen.length]; // 右上左下对称 Integer[] ruld = new Integer[queen.length]; // 顺时针第1次旋转 Integer[] cw1 = new Integer[queen.length]; for (int i = 1; i < queen.length; i++) { leftRight[i] = queen[queen.length - i]; upDown[i] = queen.length - queen[i]; lurd[queen.length - queen[i]] = queen.length - i; ruld[queen[i]] = i; cw1[queen[i]] = queen.length - i; } // 顺时针第2次旋转 Integer[] cw2 = new Integer[queen.length]; for (int i = 1; i < queen.length; i++) { cw2[cw1[i]] = queen.length - i; } // 顺时针第3次旋转 Integer[] cw3 = new Integer[queen.length]; for (int i = 1; i < queen.length; i++) { cw3[cw2[i]] = queen.length - i; } results.put(newSolution, number + "_self"); putNewSolution(leftRight, number + "_lr"); putNewSolution(upDown, number + "_ud"); putNewSolution(lurd, number + "_lurd"); putNewSolution(ruld, number + "_ruld"); putNewSolution(cw1, number + "_cw1"); putNewSolution(cw2, number + "_cw2"); putNewSolution(cw3, number + "_cw3"); return true; } protected void putNewSolution(Integer[] temp, String mark) { String newSolution = resultToString(temp); String flag = results.get(newSolution); if(flag == null) { results.put(newSolution, mark); } } protected String resultToString(Integer[] result) { StringBuilder sb = new StringBuilder(); for (int i = 1; i < queen.length; i++) { sb.append(result[i]); } return sb.toString(); } // 计算复杂度 15720 public static void main(String[] args) { Queens queen = new Queens(8); queen.backtrack(1); } }
相关推荐
总的来说,这三份Java代码为我们提供了学习和理解八皇后问题的不同角度,包括回溯法、位运算以及可能的优化技巧。通过阅读和分析这些代码,我们可以深入理解如何用编程语言解决实际问题,同时提升我们的算法设计和...
Qbasic 高效解法-递归版 c#实现 C++实现 Python实现 PASCAL实现 SHELL实现 独立解 VB实现 还有图形化显示 等等很多解决方法的综合,本人自己找资料整合出来的,望大家有用。
6. **回溯法**:回溯法用于解决组合优化问题,如八皇后问题、N皇后问题和迷宫求解。在C和Java中,通常需要借助递归和条件判断来实现。 7. **分治法**:分治策略将大问题拆分为小问题,独立解决后再合并。如归并排序...
用于解决组合优化问题,如八皇后问题、N皇后问题、数独等。 八、分治算法 将大问题分解为多个相同或相似的小问题,如快速傅里叶变换(FFT)、矩阵乘法、大整数乘法等。 这个Java实现的所有算法项目对于初学者和有...
5. **递归与回溯**:解决许多复杂问题的有效方法,如八皇后问题、图的深度遍历等。 6. **设计模式**:如工厂模式、单例模式、装饰器模式等,它们是软件设计的重要组成部分,体现了良好的编程习惯和模块化思想。 7....
6. **回溯法**:用于解决组合优化问题,如八皇后问题、N-Queens问题、棋盘覆盖等。 7. **贪心算法**:在每一步选择局部最优解,期望达到全局最优。比如Prim算法和Kruskal算法用于最小生成树,霍夫曼编码用于数据...
在编程领域,九宫格问题(也称为八皇后问题)是一个经典的算法问题,它涉及到在9x9的棋盘上放置8个皇后,使得任何两个皇后都不能在同一行、同一列或同一条对角线上。这个问题有助于理解回溯法、深度优先搜索(DFS)...
分治思想是计算机科学中的一种重要算法设计策略,它的核心理念是将一个复杂的问题分解成若干个规模较小、相互独立且与原问题形式相同的子问题,然后递归地解决这些子问题,最后将子问题的解合并得到原问题的解。...
6. **回溯法**:通常用于解决组合优化问题,如八皇后问题、N皇后问题、数独等,通过尝试所有可能的解决方案并适时回退来寻找解。 7. **分治策略**:包括大数乘法、快速傅里叶变换(FFT)、归并排序等,通过将问题...
7. **回溯法**:用于在解决问题时尝试所有可能的解决方案,如八皇后问题、N皇后问题等。 8. **分治法**:将大问题划分为小问题,独立解决后再合并结果,如归并排序、快速排序等。 9. **字符串处理**:KMP算法、...
在八皇后问题的基础上,骑士在棋盘上移动,目标是找到一种使得骑士无法再次移动到已经访问过的格子的路径。这展示了Java在解决算法问题上的应用,以及对数据结构如二维数组的理解。 3. **DrawingPanel** ...
- **递归与回溯**:用于解决复杂问题,如八皇后问题、图的深度优先搜索等。 3. **C++特有**: - **STL(Standard Template Library)**:提供容器(如vector、list)、迭代器、算法和函数对象,极大地简化了数据...
5. **回溯法**:主要用于解决组合优化问题,如八皇后问题、数独填充等,它通过试探性的构建解决方案并适时回溯来寻找正确答案。 6. **贪心算法**:贪心策略是在每一步选择中都采取当前状态下最好或最优(即最有利)...
- **递归与回溯**:在解决复杂问题时,递归和回溯算法是常用的方法,如八皇后问题、迷宫问题等。 - **动态规划**:通过构建状态转移方程解决最优化问题,例如背包问题、最长公共子序列等。 2. **数据结构应用** ...
3. **递归和动态规划**:这两种技术常用于解决复杂问题,如斐波那契数列、八皇后问题、背包问题等。 4. **图算法**:如深度优先搜索(DFS)和广度优先搜索(BFS),以及最小生成树(Kruskal或Prim算法)和最短路径...
5. **回溯法和分支限界法**:用于解决组合优化问题,如八皇后问题、N皇后问题等。 最后,**问题分析和解题策略**: 1. **阅读理解**:准确理解题目需求,这是解决问题的第一步。 2. **模型建立**:将实际问题转化为...
7. **回溯法**:用于解决多解或无解问题,如八皇后问题、N皇后问题、迷宫问题等,通过尝试所有可能的路径来寻找解决方案。 8. **分治策略**:如归并排序、快速排序、大整数乘法等,将大问题分解为小问题,独立解决...
7. **递归与回溯**:递归是许多算法的基础,如汉诺塔、八皇后问题等。回溯则常用于解决组合优化问题,如找出所有可能的解决方案。 8. **位操作**:在Java中,熟练运用位运算可以提高代码效率,比如快速求幂、判断...