【发布时间】:2015-10-20 18:15:28
【问题描述】:
嘿,我是编程新手,我在递归算法方面没有太多经验,我正在为自己开发一个简单的棋盘游戏,我必须在二维数组中搜索 '2' 并替换 ' 1 在它们的左、右和下方,如果它们存在的话。
现在这是我的问题的代码:
void check_board(char **arr, int grid_size)
{
int v, b; // to check fillment
for(v=0; v < grid_size; v++)
{
for(b=0; b < grid_size; b++)
{
if(arr[v][b]=='2' )
{
if(arr[v+1][b]=='1')
{
arr[v+1][b]='2';
}
if(arr[v][b+1]=='1')
{
arr[v][b+1]='2';
}
if(arr[v][b-1]=='1')
{
arr[v][b-1]='2';
}
}
}
}
}
这是我通过迭代检查数组的函数,但是对于大型电路板执行时间太长,我想避免这种情况,所以我想将它更改为递归会使其更快。这就是我被卡住的地方,我找不到将这个算法更改为递归算法的方法。
我不希望你写代码,因为我正在努力学习编码,但如果可能的话,我需要一些线索/提示来帮助我入门。提前感谢您的帮助,如果这个问题不好,我们深表歉意。
【问题讨论】:
-
我不知道为什么递归可能更快,但是(至少)需要两个基本操作:确保有一个退出子句,这样你就不会得到无限递归,并找到一个防止两次访问同一方格的机制 - 例如在
floodfill绘制算法中。 -
我怀疑递归算法会更快。在我看来,它的代码可能更短,但速度不会改变。此外,它甚至可能会减少,因为要运行递归函数,您的计算机将需要复制大量数据。
-
在让它更快之前,让它正确。这些邻居(
arr[v][b-1],arr[v][b+1],...)都不能保证存在。您正在分配的数据之外进行读写。另外,为什么只检查 3 个邻居? -
也许在学习递归之前学习如何使用真正的二维数组可能会很好。您在这里使用的只是通过指针数组进行的模拟。改变这一点真的可以提高你的速度。