【发布时间】:2015-05-11 22:43:48
【问题描述】:
我正在尝试理解递归,因此正在尝试为扫雷游戏编写递归函数。我的程序没有游戏界面,只是为了理解。
这是我的理解:
我有一个给定大小的网格,将用数字填充。为简单起见,我假设 0 代表我的,网格中的空单元格将由数字 9 表示。这是我的网格:
0 1 9 9 9
1 1 9 9 9
9 9 9 9 9
9 9 9 1 1
9 9 9 1 0
这是我的递归算法。我想我已经输入了正确的边界条件,但似乎是进入无限递归的算法:
基本情况:
如果网格坐标小于 0,即 x grid.length-1 OR y > grid.length-1
返回
其他
如果网格显示 0 或 9 以外的数字,则显示数字,即 grid[x][y]!=0 && grid[x][y]!=9
else 如果网格显示 0 表示它是地雷,则显示 Game over
其他
所有周围 8 个单元格的递归案例,因为所有周围单元格都可以安全打开
这里有一些代码显示我在算法中列出的内容:
public static void playGame(int[][]grid, int x, int y){
if(x > grid.length-1 || x <0 || y > grid.length-1 || y<0){
return;
}else{
if(grid[x][y] !=0 && grid[x][y]!=9){
//means this is a valid number to display to user
System.out.println("opening cell:"+x+","+y+" "+grid[x][y]);
}else if(grid[x][y] == 0){
System.out.println("Game over!");
//might want to show all mine locations
}else{
//all 8 cells are safe to open
playGame(grid,x-1,y-1); //left
playGame(grid,x,y-1); //up
playGame(grid,x,y+1);//down
playGame(grid,x+1,y);//diagonal
playGame(grid,x-1,y); //diagonal
playGame(grid,x+1,y-1);//diagonal
playGame(grid,x+1,y+1);//right
playGame(grid,x-1,y+1);//diagonal
}
}
}
我将单元格作为 2,2 传递,它给了我 java.lang.StackOverflowError。 有人可以在这里指导我吗。我对算法或递归的理解是否存在问题,或者我可能引入了一些错误。我无法发现问题。
【问题讨论】:
-
“1”代表什么?
-
1 表示该单元格周围有 1 个地雷(用 0 表示)。
-
尝试在方法顶部打印 grid.length, x, y?它可能会提供一些线索。
-
我在程序中有一些打印语句会继续打印:opening cell:1,0 1. 我在想,当它打开空白单元格时,它会回到它开始的地方并继续进行递归。我应该包括一些东西来访问单元格吗?我没有看到任何人这样做,所以持怀疑态度。
-
这个算法看起来正确吗?我想先检查我是否遗漏了任何条件?
标签: algorithm recursion minesweeper