`

java-八皇后问题

 
阅读更多

public class EightQueen {

	/**
	 * 八皇后问题
	 * obviously,the location of a queen includes two index: row and column
	 * 1.the eight queens should be put in different rows and different columns
	 * 2.so,a integer array-(we name it columnIndex[8])
	 *    the index of array is from 0 to 7,we can use it as the rowIndex of a location:
	 *    rowIndex:     0  1  2  3  4  5  6  7 
	 *    columnIndex:  a0 a1 a2 a3 a4 a5 a6 a7(well,ai=columnIndex[i])
	 * 3.a0 a1 a2 a3 a4 a5 a6 a7 is a permutation of (0 1 2 3 4 5 6 7)
	 * 4.we output the permutations which does not violate the rules of EightQueen:
	 * 	 "任两个皇后都不能处于同一条横行、纵行或斜线上"
	 * 5.but how to judge?
	 *   let's look at this.we assume that after a permutation,the status is:
	 *     i= 0 1 2 3 4 5 6 7
	 *   a[i]=0 4 5 7 2 6 1 3
	 *   we found that (1,4) and (2,5) share the same diagonal.
	 *   that is a[i]-a[j]=i-j or a[i]-a[j]=j-i
	 * 
	 */
	public static void main(String[] args) {
		int MAX=8;
		int[] columnIndex=new int[MAX];
		for(int i=0;i<MAX;i++){
			columnIndex[i]=i;
		}
		eightQueen(columnIndex,0,MAX-1);//permutation(a,0,a.length-1)
		System.out.println(sum);
	}

	private static int sum;
	//produce permutation,print it if it obeys the rules of EightQueen
	public static void eightQueen(int[] columnIndex,int first,int last){
		if(first==last){
			if(check(columnIndex)){
				printQueenLocation(columnIndex);
				sum++;
			}
		}else{
			for(int i=first;i<=last;i++){
				swap(columnIndex,first,i);
				eightQueen(columnIndex,first+1,last);
				swap(columnIndex,first,i);
			}
		}
	}
	
	
	//the rule:can't be (a[i]-a[j]=i-j or a[i]-a[j]=j-1)
	public static boolean check(int[] columnIndex){
		boolean re=true;
		for(int i=0,len=columnIndex.length;i<len;i++){
			for(int j=i+1;j<len;j++){
				if((j-i==columnIndex[j]-columnIndex[i])||(i-j==columnIndex[j]-columnIndex[i])){
					re=false;
					break;
				}
			}
		}
		return re;
	}
	
	//print (i,j)
	public static void printQueenLocation(int[] columnIndex){
		for(int i=0,len=columnIndex.length;i<len;i++){
			System.out.print("(i,j)=("+i+","+columnIndex[i]+")");
		}
		System.out.println();
	}
	
	public static void swap(int[] a, int i, int j){
		int temp =a[i];
		a[i] = a[j];
		a[j] = temp;
	}
}

0
0
分享到:
评论

相关推荐

    java--八皇后问题的势力范围解法

    java--八皇后问题的势力范围解法: 用的是eclipse运行的,特色在于运用势力范围,每当放置一个皇后就会将其下面影响到的空格的势力值加1,每次回溯的时候减1,用一个2维数组保存,相当直观。

    java求解n queques 问题-八皇后问题

    利用回溯法求解八皇后问题,从八皇后问题延伸到n皇后问题。利用水平,主对角线,反对角线三个数组简化算法。 使用方法: 输入要求解的n皇后数目,程序自动输出每种具体方案和总的方法数。

    Java实现八皇后问题

    用Java编程实现八皇后问题,程序中采用了回溯法实现八皇后这一传统问题。

    java解八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。有多种方法可以解决此问题,这次利用java语言和递归以及回溯算法解决,至于其他语言见后续资源

    java代码八皇后问题

    在Java中实现八皇后问题,通常会采用回溯法。回溯法是一种试探性的解决问题的方法,它尝试分步地构造解决方案,并在每一步选择时,都尽可能选用能导致解决方案的选项。如果发现某一步选择无法达到目标,就退回一步,...

    JAVA实现的八皇后问题

    用JAVA实现的八皇后问题。学习JAVA时练手写的程序,分享下。我真是各种喜欢写八皇后算法

    八皇后问题java实现

    八皇后java实现。八皇后问题是经典的回溯算法的应用,8x8的棋盘我们可以按行或者按列确定皇后的位置,比如我这边是按行安排皇后的位置,那么堆栈里存放的则是其所在列数。

    八皇后问题求解 java

    在这个Java程序设计中,我们将深入探讨如何利用回溯法来解决八皇后问题。 回溯法是一种试探性的解决问题的方法,它尝试逐步构造可能的解决方案,如果在某一步发现当前的选择不能导致有效的解决方案,就会撤销这一步...

    JAVA版八皇后--简单易懂

    用纯JAVA写的八皇后,很简单,看后就会明白,不会产生歧义

    八皇后 的三种解法 (java编写)

    《八皇后问题与Java编程实现》 八皇后问题是一个经典的回溯算法问题,源自19世纪的数学家欧拉提出,旨在在8×8的棋盘上放置8个皇后,使得任意两个皇后都无法通过直线互相攻击,即任意一行、一列或对角线上都不能有...

    Java 小游戏-八皇后

    学长用JBuilder做的一个小游戏,希望对大家的学习有帮助

    八皇后问题java

    经典八皇后问题,结构简单,算法不是最优的

    八皇后问题算法java实现

    Java实现八皇后问题,两重循环,检查左右斜对角线,有压栈,回溯

    八皇后-java源码

    八皇后 java源码,可以任意改变变量来实现n皇后问题

    Java版八皇后编程

    八皇后问题,java实现。包里有两个类,分属不同的方法实现的八皇后。

    八皇后问题-Java大作业

    在Java中,解决八皇后问题通常使用递归。递归策略是自底向上的尝试和回溯,即先尝试在当前行放置皇后,如果发现无法放置(因为与已放置的皇后冲突),则退回至上一行,并改变上一行皇后的位置,继续尝试。这一过程...

    java八皇后递归算法

    不是很好的一个java八皇后算法!! 不过觉对是真的哦

    八皇后JAVA解法

    八皇后的递归解法,欢迎改进讨论。 下载后把java 类放到想要的package 下即可运行

Global site tag (gtag.js) - Google Analytics