原:八皇后问题的递归和非递归Java实现

原:八皇后问题的递归和非递归实现

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名
的数学家高斯1850年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即
任意两个皇后都不能处于同一行,同一列或同一斜线上,问有多少种摆法。

高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后
来有人用图论的方法解出92种结果。事实上就是有92种解法。

以下是代码:

import . io . * (@more@);
进口java.util。*;

类皇后区{
最后布尔可用=true;
最后int广?5,规范=广场- 1;
int [] positionInRow=new int[方块];
布尔[]列=新布尔[方块];
布尔[]leftDiagonal=新布尔[方块* 2 - 1];
布尔[]rightDiagonal=新布尔[方块* 2 - 1];
int多少=0;
列表queensList=new ArrayList ();

皇后区(){
(int i=0;我<广场;我+ +){
positionInRow[我]=1;
专栏[我]=可用;
}
(int i=0;我<广场* 2 - 1;我+ +)
leftDiagonal[我]=rightDiagonal[我]=可用;
}
空白printBoard (PrintStream, int, int坳){

。println("行=" +行+”,上校=" +坳);
}


空白putQueen (int行){
的arr int[]=零;
(int坳=0;坳<广场;+ +)
如果上校(列(col)==& &
可用leftDiagonal[行+坳]==& &
可用rightDiagonal [row-col +规范]==){

positionInRow(行)=坳;
列(col)=!可用;
leftDiagonal[行+坳]=!可用;
rightDiagonal [row-col +规范]=!可用;如果(行
squares-1)
putQueen(行+ 1);


其他{
(int kk=0;kk system . out。print (positionInRow (kk) +”、“);
}
System.out.println ();

arr=new int [positionInRow.length];
系统。arraycopy (arr positionInRow 0 0 positionInRow.length);
queensList.add (arr);

。多少+ +;
}

列(col)=可用;
leftDiagonal[行+坳]=可用;
rightDiagonal [row-col +规范]=可用;

}
}


空白putQueen () {
int *=1;
布尔标志=false;
int[]圣=new int[方块];
int [] st2=new int[方块];
int顶级=0;

(int行=0,坳=0;行<广场。)({
;坳<广场;坳+ +){
如果可用(列(col)==& &
leftDiagonal[行+坳]==& &
可用rightDiagonal [row-col +规范]==){



positionInRow(行)=坳;
列(col)=!可用;
leftDiagonal[行+坳]=!可用;
rightDiagonal [row-col +规范]=!可用;



圣(顶级)=行;
st2[上]=坳;
+ +大;

=0;上校
行+ +;
标记=true;
打破;
}



}

如果(行==广场)
(int k=0;k 如果(positionInRow [k] !=1) {
如果(k==positionInRow.length-1) {
(int kk=0;kk system . out。print (positionInRow (kk) +”、“);
}
System.out.println ();
。多少+ +;

}
}
}



如果(st2 [0]==squares-1&&top==0)返回;

如果(/*坳==广场*/!国旗){
如果(/* ! st.isEmpty () & & ! st2.isEmpty () */!=0) {
/*行=((整数)st.pop ()) .intValue ();
坳=((整数)st2.pop ()) .intValue ();*/
顶部,行=圣(顶部);坳=st2(顶部);

列(col)=可用;
leftDiagonal[行+坳]=可用;
rightDiagonal [row-col +规范]=可用;
+ +上校;
}


}
标记=false;


如果(行==广场){

行=0;

}





}
}

空白getAllSymmetricalQueens () {
int [] q, q2,
(int i=0;我 q=(int []) queensList.remove (0);

(int j=0;j q2=(int []) queensList.get (j);


int k;
(k=0; k <广场;k + +) {
如果(q [k] + q2 [k] !=squares-1)
打破;
}
如果(k==广场){
(k=0;k system . out。打印(q [k] +”、“);
system . out。打印(”和“);
(k=0;k system . out。打印(q2 [k] +”、“);
system . out。打印(“symmetricaln”);
}


}
}
}

公共静态孔隙主要(String参数[]){
女王女王=new皇后区();
queens.putQueen (0);System.out.println (“- - - - - - - - - - - - - - - - -”);
queens.putQueen ();


System.out.println(皇后区。发现多少+”解决方案。”);

queens.getAllSymmetricalQueens ();
}
}

转载请注明出处:http://herosoft.itpub.net/post/5802/487069

原:八皇后问题的递归和非递归Java实现