此代码适用于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;
}
}
}
可能出现什么问题?
答案 0 :(得分:4)
因为这是一项编程练习......
提示:比较push
正文中的pop
来电和tourFrom
来电。
好的,所以这是我用来解决的逻辑。
这不是一个无限递归问题,因为那会产生StackOverflowError
,而不是OutOfMemoryError
。
OutOfMemoryError
表示某种存储泄漏。 (可能还有其他问题......但是我们会追求存储泄漏的想法。)
问:哪个是唯一可能无限制的数据结构?
答:堆栈。
问:这怎么会无限增长?答:如果你做的比弹出更多。
所以看看推送和弹出代码......
答:算一算: - )
退一步看看解决方案,还有其他问题。例如,您没有使用tourFrom
返回的值。这意味着您将始终报告找到解决方案,并且在找到解决方案时您不会停止。
我真的怀疑&gt;&gt;这&lt;&lt;代码适用于较小的电路板尺寸。