c# - 洪水填充递归算法

标签 c# algorithm recursion fill stack-overflow

我正在尝试制作一种可以在 C# 中填充 int 数组的算法。基本上,作为 MS Paint 中的填充工具,我有一种颜色,如果我在数组中选择 (x,y) 坐标,它将用新颜色替换所有具有相同初始颜色的邻居。

例如:

[0,0,0]
[0,1,0]
[1,1,0]

如果我将 3 放入 (0,0),则数组变为:

[3,3,3]
[3,1,3]
[1,1,3]

所以我以递归方式尝试了它,它确实有效,但不是一直有效。实际上,我有时会遇到“堆栈溢出”错误(似乎很合适)。 这是我的代码,如果你能告诉我哪里出了问题,那就太好了:)

public int[,] fill(int[,] array, int x, int y, int initialInt, int newInt)
{
    if (array[x, y] == initialInt)
    {
        array[x, y] = newInt;

        if (x < array.GetLength(0) - 1)
            array = fill(array, (x + 1), y, initialInt, newInt);
        if (x > 0)
            array = fill(array, (x - 1), y, initialInt, newInt);

        if (y < array.GetLength(1) - 1)
            array = fill(array, x, (y + 1), initialInt, newInt);
        if (y > 0)
            array = fill(array, x, (y - 1), initialInt, newInt);
    }

    return array;
}

谢谢!

最佳答案

如何使用堆栈/队列来管理剩余工作?

public void Fill(int[,] array, int x, int y, int newInt)
{
    int initial = array[x,y];

    Queue<Tuple<int,int>> queue = new Queue<Tuple<int,int>>();
    queue.Push(new Tuple<int, int>(x, y));

    while (queue.Any())
    {
        Tuple<int, int> point = queue.Dequeue();

        if (array[point.Value1, point.Value2] != initial)
            continue;

        array[point.Value1, point.Value2] = newInt;

        EnqueueIfMatches(array, queue, point.Value1 - 1, point.Value2, initial);
        EnqueueIfMatches(array, queue, point.Value1 + 1, point.Value2, initial);
        EnqueueIfMatches(array, queue, point.Value1, point.Value2 - 1, initial);
        EnqueueIfMatches(array, queue, point.Value1, point.Value2 + 1, initial);        
    }
}

private void EnqueueIfMatches(int[,] array, Queue<Tuple<int, int>> queue, int x, int y, int initial)
{
    if (x < 0 || x >= array.GetLength(0) || y < 0 || y >= array.GetLength(1))
        return;

    if (array[x, y] == initial)
       queue.Enqueue(new Tuple<int, int>(x, y));
}

关于c# - 洪水填充递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358513/

相关文章:

python - 递归函数的产量

c# - Visual Studio 如何检查类的所有公共(public)成员是否在接口(interface)中定义

c# - 如何从 MongoDB 中选择选定的值?

c# - 从 WPF 应用捕获视频

algorithm - 如果我们将 Peterson 算法中的命令重新排序以实现互斥,会发生什么情况?

c# - 确定对于给定的 RGB 值组合,哪种颜色(红色、蓝色、绿色或其他)可见?

c# - 带有 SOS 的 Windbg,如何转储 c# 结构

java - 神经网络反向传播算法卡在异或训练模式上

recursion - 在纸上进行递归的简单方法?

java - 如何使用 Jsoup 递归遍历 HTML 树?