`
kingxss
  • 浏览: 973844 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

八皇后问题独立解JAVA代码

阅读更多
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编写)

    总的来说,这三份Java代码为我们提供了学习和理解八皇后问题的不同角度,包括回溯法、位运算以及可能的优化技巧。通过阅读和分析这些代码,我们可以深入理解如何用编程语言解决实际问题,同时提升我们的算法设计和...

    八皇后各种解决方法综合,并图形化显示

    Qbasic 高效解法-递归版 c#实现 C++实现 Python实现 PASCAL实现 SHELL实现 独立解 VB实现 还有图形化显示 等等很多解决方法的综合,本人自己找资料整合出来的,望大家有用。

    常见算法(C,java两种实现代码)

    6. **回溯法**:回溯法用于解决组合优化问题,如八皇后问题、N皇后问题和迷宫求解。在C和Java中,通常需要借助递归和条件判断来实现。 7. **分治法**:分治策略将大问题拆分为小问题,独立解决后再合并。如归并排序...

    Java实现所有算法(代码)

    用于解决组合优化问题,如八皇后问题、N皇后问题、数独等。 八、分治算法 将大问题分解为多个相同或相似的小问题,如快速傅里叶变换(FFT)、矩阵乘法、大整数乘法等。 这个Java实现的所有算法项目对于初学者和有...

    《剑指offer》Java版代码

    5. **递归与回溯**:解决许多复杂问题的有效方法,如八皇后问题、图的深度遍历等。 6. **设计模式**:如工厂模式、单例模式、装饰器模式等,它们是软件设计的重要组成部分,体现了良好的编程习惯和模块化思想。 7....

    java多种算法实现代码

    6. **回溯法**:用于解决组合优化问题,如八皇后问题、N-Queens问题、棋盘覆盖等。 7. **贪心算法**:在每一步选择局部最优解,期望达到全局最优。比如Prim算法和Kruskal算法用于最小生成树,霍夫曼编码用于数据...

    九宫问题的广度优先java实现

    在编程领域,九宫格问题(也称为八皇后问题)是一个经典的算法问题,它涉及到在9x9的棋盘上放置8个皇后,使得任何两个皇后都不能在同一行、同一列或同一条对角线上。这个问题有助于理解回溯法、深度优先搜索(DFS)...

    分治思想的棋盘算法java实现

    分治思想是计算机科学中的一种重要算法设计策略,它的核心理念是将一个复杂的问题分解成若干个规模较小、相互独立且与原问题形式相同的子问题,然后递归地解决这些子问题,最后将子问题的解合并得到原问题的解。...

    java算法大全源码包

    6. **回溯法**:通常用于解决组合优化问题,如八皇后问题、N皇后问题、数独等,通过尝试所有可能的解决方案并适时回退来寻找解。 7. **分治策略**:包括大数乘法、快速傅里叶变换(FFT)、归并排序等,通过将问题...

    java算法大全,有近100多种。

    7. **回溯法**:用于在解决问题时尝试所有可能的解决方案,如八皇后问题、N皇后问题等。 8. **分治法**:将大问题划分为小问题,独立解决后再合并结果,如归并排序、快速排序等。 9. **字符串处理**:KMP算法、...

    Java课程设计案例精编源代码(1).rar

    在八皇后问题的基础上,骑士在棋盘上移动,目标是找到一种使得骑士无法再次移动到已经访问过的格子的路径。这展示了Java在解决算法问题上的应用,以及对数据结构如二维数组的理解。 3. **DrawingPanel** ...

    C、C++、JAVA数据结构与算法电子书

    - **递归与回溯**:用于解决复杂问题,如八皇后问题、图的深度优先搜索等。 3. **C++特有**: - **STL(Standard Template Library)**:提供容器(如vector、list)、迭代器、算法和函数对象,极大地简化了数据...

    各种算法的java实现

    5. **回溯法**:主要用于解决组合优化问题,如八皇后问题、数独填充等,它通过试探性的构建解决方案并适时回溯来寻找正确答案。 6. **贪心算法**:贪心策略是在每一步选择中都采取当前状态下最好或最优(即最有利)...

    java经典算法练习题

    - **递归与回溯**:在解决复杂问题时,递归和回溯算法是常用的方法,如八皇后问题、迷宫问题等。 - **动态规划**:通过构建状态转移方程解决最优化问题,例如背包问题、最长公共子序列等。 2. **数据结构应用** ...

    JAVA语言程序设计与数据结构课后 编程题解析

    3. **递归和动态规划**:这两种技术常用于解决复杂问题,如斐波那契数列、八皇后问题、背包问题等。 4. **图算法**:如深度优先搜索(DFS)和广度优先搜索(BFS),以及最小生成树(Kruskal或Prim算法)和最短路径...

    蓝桥杯Java语言C组真题

    5. **回溯法和分支限界法**:用于解决组合优化问题,如八皇后问题、N皇后问题等。 最后,**问题分析和解题策略**: 1. **阅读理解**:准确理解题目需求,这是解决问题的第一步。 2. **模型建立**:将实际问题转化为...

    42-cases-of-classic-algorithms-JAVA.rar_algorithms

    7. **回溯法**:用于解决多解或无解问题,如八皇后问题、N皇后问题、迷宫问题等,通过尝试所有可能的路径来寻找解决方案。 8. **分治策略**:如归并排序、快速排序、大整数乘法等,将大问题分解为小问题,独立解决...

    java经典算法50题

    7. **递归与回溯**:递归是许多算法的基础,如汉诺塔、八皇后问题等。回溯则常用于解决组合优化问题,如找出所有可能的解决方案。 8. **位操作**:在Java中,熟练运用位运算可以提高代码效率,比如快速求幂、判断...

Global site tag (gtag.js) - Google Analytics