8x8骑士之旅Java内存不足

时间:2014-05-05 14:57:38

标签: java out-of-memory backtracking

此代码适用于5x5,6x6,7x7但在8x8中内存不足。我增加了内存到2048M,但它仍然无法正常工作。代码应该使用Stack类和回溯作为解决方案的一部分 这是代码:

private int counter=0;
private boolean grid[][]=new boolean [ROWS][COLS];
private  Stack tour=new Stack(0,0);
private int spaces=ROWS*COLS;
private int[][] intGrid=new int[ROWS][COLS];


private static final Point[] Moves=new Point[]{
    new Point(-1, -2),
    new Point(-1, 2),
    new Point(1, -2),
    new Point(1, 2),
    new Point(-2, -1),
    new Point(-2, 1),
    new Point(2, -1),
    new Point(2, 1),
};

public void run(){
    fillIntGrid();
    tourFrom(tour.first);
    println("SOLUTION FOUND:");
    printBoard();
}

public boolean tourFrom(Point currPoint){
    counter++;
    grid[currPoint.xCoord][currPoint.yCoord] = true;
    intGrid[currPoint.xCoord][currPoint.yCoord]=counter;
    if(counter==spaces)
        return true;
    for(Point nextMove:Moves){
        int nextRow=currPoint.xCoord+nextMove.xCoord;
        int nextCol =currPoint.yCoord+nextMove.yCoord;
        tour.push(nextRow,nextCol);
        if(nextRow<0 || nextRow>=grid.length)
            continue;
        else if(nextCol<0 || nextCol>=grid.length)
            continue;
        else if(grid[nextRow][nextCol])
            continue;
        if(tourFrom(tour.first))
            return true;
        } 
    grid[currPoint.xCoord][currPoint.yCoord] = false;
    intGrid[currPoint.xCoord][currPoint.yCoord]=0;
    counter--;
    tour.pop();
    return false;
}

public void fillIntGrid(){
    for(int i=0;i<ROWS;i++){
        for (int j=0;j<COLS;j++){
            intGrid[i][j]=0;
        }
    }
}

可能出现什么问题?

1 个答案:

答案 0 :(得分:4)

因为这是一项编程练习......

提示:比较push正文中的pop来电和tourFrom来电。


好的,所以这是我用来解决的逻辑。

这不是一个无限递归问题,因为那会产生StackOverflowError,而不是OutOfMemoryError

OutOfMemoryError表示某种存储泄漏。 (可能还有其他问题......但是我们会追求存储泄漏的想法。)

问:哪个是唯一可能无限制的数据结构?

答:堆栈。

问:这怎么会无限增长?

答:如果你做的比弹出更多。

所以看看推送和弹出代码......


问:但是6x6和7x7(据说)怎么工作呢?

答:算一算: - )


退一步看看解决方案,还有其他问题。例如,您没有使用tourFrom返回的值。这意味着您将始终报告找到解决方案,并且在找到解决方案时您不会停止。

我真的怀疑&gt;&gt;这&lt;&lt;代码适用于较小的电路板尺寸。