我在程序中使用了递归泛洪函数。该程序在下面给出
void floodfill(int x, int y, int &array[100][100])
{
if (array[x][y]==0)
{
array[x][y]=1;
floodfill(x+1, y, array);
floodfill(x, y+1, array);
floodfill(x-1, y, array);
floodfill(x, y-1, array);
}
}
int main()
{
int x= 1;// x and y is the point to start the floodfill
int y= 10;
int array[100][100] = {0};
floodfill(x, y, array);
}
我想知道是否有一种方法可以编程此递归函数,使其完全在int主循环内发生而不创建函数?
PS:-我知道定义一个函数然后在主程序中使用它是一种好的编程习惯,但是我正在从事的项目的体系结构无法使我使用函数进行洪水填埋。因此,我需要int主要部分中完整的Floodfill程序。这也不是完整的代码。代码中未提供初始化数组值的部分。
答案 0 :(得分:2)
简短回答:否
您需要传递参数以使代码正常工作。 Main不带任何参数。
然后我觉得有必要问你为什么要这么做?将代码分解为定义明确的细小部分,执行特定任务是一种好的编程习惯。然后将其隔离在一个函数中,并为其他所有人记录/描述该函数,以了解其功能。
因此,即使您可以做到,您也应该避免这样做。
答案 1 :(得分:1)
DFS可以不使用递归而仅使用堆栈来实现,因此您可能希望看到以下内容: https://www.codeproject.com/Tips/723337/Depth-First-Search-DFS-Non-recursive
此代码是针对树实现的,但是算法相同。
答案 2 :(得分:0)
局部非静态变量,包括诸如array
之类的数组,默认情况下不会初始化。它们的值将是不确定的,并且几乎是随机的。
除初始化变量外,以任何方式使用此类变量都会导致undefined behavior。
之所以会这样,是因为您在不初始化的情况下比较了数组中的值。
此外,也是未定义行为的来源,您没有边界检查!这意味着您的函数可以(并且将)超出数组的范围。
要解决第一个问题,您需要初始化数组:
int array[100][100] = { 0 }; // Set all elements to zero
要解决第二个问题,您需要在函数中添加边界检查:
if (x < 0 || x >= 100 || y < 0 || y >= 100)
return;