原:八皇后问题的递归和非递归实现
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名
的数学家高斯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.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
如果(k==positionInRow.length-1) {
(int kk=0;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;我
(int j=0;j
int k;
(k=0; k <广场;k + +) {
如果(q [k] + q2 [k] !=squares-1)
打破;
}
如果(k==广场){
(k=0;k
system . out。打印(”和“);
(k=0;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