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;
}
}
分享到:
相关推荐
java--八皇后问题的势力范围解法: 用的是eclipse运行的,特色在于运用势力范围,每当放置一个皇后就会将其下面影响到的空格的势力值加1,每次回溯的时候减1,用一个2维数组保存,相当直观。
利用回溯法求解八皇后问题,从八皇后问题延伸到n皇后问题。利用水平,主对角线,反对角线三个数组简化算法。 使用方法: 输入要求解的n皇后数目,程序自动输出每种具体方案和总的方法数。
用Java编程实现八皇后问题,程序中采用了回溯法实现八皇后这一传统问题。
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。有多种方法可以解决此问题,这次利用java语言和递归以及回溯算法解决,至于其他语言见后续资源
在Java中实现八皇后问题,通常会采用回溯法。回溯法是一种试探性的解决问题的方法,它尝试分步地构造解决方案,并在每一步选择时,都尽可能选用能导致解决方案的选项。如果发现某一步选择无法达到目标,就退回一步,...
用JAVA实现的八皇后问题。学习JAVA时练手写的程序,分享下。我真是各种喜欢写八皇后算法
八皇后java实现。八皇后问题是经典的回溯算法的应用,8x8的棋盘我们可以按行或者按列确定皇后的位置,比如我这边是按行安排皇后的位置,那么堆栈里存放的则是其所在列数。
在这个Java程序设计中,我们将深入探讨如何利用回溯法来解决八皇后问题。 回溯法是一种试探性的解决问题的方法,它尝试逐步构造可能的解决方案,如果在某一步发现当前的选择不能导致有效的解决方案,就会撤销这一步...
用纯JAVA写的八皇后,很简单,看后就会明白,不会产生歧义
《八皇后问题与Java编程实现》 八皇后问题是一个经典的回溯算法问题,源自19世纪的数学家欧拉提出,旨在在8×8的棋盘上放置8个皇后,使得任意两个皇后都无法通过直线互相攻击,即任意一行、一列或对角线上都不能有...
学长用JBuilder做的一个小游戏,希望对大家的学习有帮助
经典八皇后问题,结构简单,算法不是最优的
Java实现八皇后问题,两重循环,检查左右斜对角线,有压栈,回溯
八皇后 java源码,可以任意改变变量来实现n皇后问题
八皇后问题,java实现。包里有两个类,分属不同的方法实现的八皇后。
在Java中,解决八皇后问题通常使用递归。递归策略是自底向上的尝试和回溯,即先尝试在当前行放置皇后,如果发现无法放置(因为与已放置的皇后冲突),则退回至上一行,并改变上一行皇后的位置,继续尝试。这一过程...
不是很好的一个java八皇后算法!! 不过觉对是真的哦
八皇后的递归解法,欢迎改进讨论。 下载后把java 类放到想要的package 下即可运行