我已经使用递归编写了以下程序,但我无法弄清楚如何以非递归方式编写它。每次我运行我的非递归版本时,数字都会消失。关于如何在没有递归的情况下编写以下方法的任何建议?
int countCells(color grid[ROWS][COLS], int r, int c) {
if (r < 0 || r >= ROWS || c < 0 || c >= COLS) {
return 0;
} else if (grid[r][c] != ABNORMAL) {
return 0;
} else {
grid[r][c] = TEMPORARY;
return 1
+ countCells(grid,r-1,c-1) + countCells(grid,r-1,c)
+ countCells(grid,r-1,c+1) + countCells(grid,r,c+1)
+ countCells(grid,r+1,c+1) + countCells(grid,r+1,c)
+ countCells(grid,r+1,c-1) + countCells(grid,r,c-1);
}
}
这是我尝试过的:
int countCells(color grid[ROWS][COLS], int r, int c)
{
int temp = 0;
if (r < 0 || r >= ROWS || c < 0 || c >= COLS)
{
return 0;
}
else if (grid[r][c] != ABNORMAL)
{
return 0;
}
else
{
int original_row = r;
int original_column = c;
while(r >= 0 && row < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
r = r - 1;
c = c - 1;
}
r = original_r;
c = original_c;
while(r >= 0 && r < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
r = r - 1;
}
r = original_r;
c = original_c;
while(r >= 0 && r < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
r = r - 1;
c = c + 1;
}
r = original_r;
c = original_c;
while(r >= 0 && r < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
c = c + 1;
}
r = original_r;
c = original_c;
while(r >= 0 && r < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
r = r + 1;
c = c + 1;
}
r = original_r;
c = original_c;
while(r >= 0 && r < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
r = r + 1;
}
r = original_r;
c = original_c;
while(r >= 0 && r < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
r = r + 1;
c = c - 1;
}
r = original_r;
c = original_c;
while(r >= 0 && r < ROWS && c >= 0 && c < COLS && grid[r][c] == ABNORMAL)
{
grid[r][c] = TEMPORARY;
temp = temp + 1;
c = c - 1;
}
r = original_r;
c = original_c;
return temp;
}
}
答案 0 :(得分:1)
非递归执行此操作的最简单方法是维护要检查的位置列表。伪代码看起来像这样:
list horizon = new empty list;
horizon.push(r, c);
count = 0;
while(!horizon.empty())
{
r, c = horizon.pop();
if(boundscheck(r, c) && grid[r][c] == ABNORMAL)
{
count++;
horizon.push(r-1, c-1);
horizon.push(r-1, c );
// etc ...
grid[r][c] = TEMPORARY;
}
}
编辑:你一定要看flood fill algorithms上的这篇文章。
答案 1 :(得分:1)
这似乎是一种经典的flood fill算法。写入非递归泛洪填充程序有点棘手;你需要在某个地方临时存储,堆栈是最容易获得它的地方。链接的文章讨论了一些其他技术,包括使用数组本身作为临时空间(右手填充算法)。
答案 2 :(得分:0)
int count = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < COLS; j++)
{
if (grid[i,j] != ABNORMAL) count++;
}
}