微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

洪水填充递归算法

如何解决洪水填充递归算法

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

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#中的int数组的算法。基本上,作为MS
Paint中的填充工具,我有一种颜色,如果我在数组中选择(x,y)坐标,它会将具有相同初始颜色的所有邻居替换为新颜色。

例如:

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

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

[3,3,3]
[3,3]
[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),newInt);

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

    return array;
}

谢谢 !

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。