为什么我的这个算法有时会StackOverflowError,代码如下
package algorithm;
public class EightQueen {
/**
* @param args
*/
public static void main(String[] args) {
EightQueen self = new EightQueen();
for(int i=12;i<13;i++){
self.queen(i);
}
}
public void queen(int n){
System.out.println("======== "+n+" ========");
int[][] grid = new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
grid[i][j] = 0;
}
}
init(grid,0,0,false,n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1){
System.out.print(" + ");
}else{
System.out.print(" - ");
}
}
System.out.println();
}
}
public void init(int[][] grid,int horizontal,int vertical,boolean isBack,int size){
if(isBack){
if(horizontal==28&&vertical==16){
System.out.println();
}
grid[horizontal][vertical] = 0;
vertical++;
}
if(vertical>=size){
horizontal--;
if(horizontal<0){
System.out.println("No result!");
return ;
}
for(int i=0;i<size;i++){
if(grid[horizontal][i]==1){
init(grid,horizontal,i,true,size);
return ;
}
}
}
for(int i=0;i<horizontal;i++){
for(int j=0;j<size;j++){
if(grid[i][j]==1&&!isFree(horizontal,vertical,i,j)){
init(grid,horizontal,vertical,true,size);
return ;
}
}
}
grid[horizontal][vertical] = 1;
System.out.println(horizontal+":"+vertical);
if(++horizontal>=size){
return ;
}
init(grid,horizontal,0,false,size);
return ;
}
private boolean isFree(int x,int y,int holdX,int holdY){
if(x==holdX||y==holdY){//同一横排或竖排
return false;
}
int slant1 = (x-holdX)-(y-holdY);
int slant2 = (x-holdX)+(y-holdY);
if(slant1==0||slant2==0){//两条斜线
return false;
}
return true;
}
}
分享到:
相关推荐
递 归 算 法 举 例——八皇后问题详解,和大家分享~
八皇后问题 递归算法 可以输入皇后的值 输出排列的结果
八皇后递归算法C代码实现 输出格式如下: |Q| | | | | | | | | | | | |Q| | | | | | | | | | | |Q| | | | | | |Q| | | | | |Q| | | | | | | | | | | | |Q| | | |Q| | | | | | | | | | |Q| | | | | linux终端输出...
斐波那契递归时间和非递归时间的比较(csdn)————程序
用非递归解决八皇后的问题,是经典的非递归算法,学习数据结构中很有用
用递归解决八皇后问题的一段代码,专门写了较为详细的注释,本人原创,如有雷同,纯属巧合。
不是很好的一个java八皇后算法!! 不过觉对是真的哦
八皇后的非递归代码:全部代码分享,方便各位java初学者学习
用递归解决八皇后 蛮简单的 用递归解决八皇后 蛮简单的用递归解决八皇后 蛮简单的用递归解决八皇后 蛮简单的用递归解决八皇后 蛮简单的用递归解决八皇后 蛮简单的
对经典算法八皇后问题的说明,以及代码示例,代码中有详尽的注释,有助于读者充分理解其递归调用的逻辑!
递归调用详解,代码详细讲解了如递归调用以及调用中应该注意的一些问题
八皇后算法,使用递归算法,delphi面向对象实现
算法思想——递归与分治 算法思想——递归与分治
数据结构八皇后问题 eightqueens
使用递归方法解决了n皇后问题,初学递归的朋友可以参考一下!
实现主窗口的棋子摆放规则,可以选用线性存储结构和图形结构构造一个新的数据结构,定义在其上的功能为根据循环递归法改变中皇后的位置,并将其传递给整个棋盘的对象,使其按照要求实现棋子的摆放,直到出现正确的...
用递归实现简单的进制转化器(模块化设计):学习递归题型之一(csdn)————程序
递归调用详解,分析递归调用的详细过程[参考].pdf
(2)行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态; (3)对角线:对角线有两个方向。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么...
算法进阶 01 递归调用 打表