加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Flood填充递归算法

发布时间:2020-12-15 08:44:16 所属栏目:百科 来源:网络整理
导读:我正在尝试制作一个可以在c#中填充int数组的算法.基本上,作为MS Paint中的填充工具,我有一个颜色,如果我在数组中选择(x,y)坐标,它会用新颜色替换所有具有相同初始颜色的邻居. 例如: [0,0][0,1,0][1,0] 如果我将3放入(0,0),则数组变为: [3,3,3][3,3][1,3]
我正在尝试制作一个可以在c#中填充int数组的算法.基本上,作为MS Paint中的填充工具,我有一个颜色,如果我在数组中选择(x,y)坐标,它会用新颜色替换所有具有相同初始颜色的邻居.

例如:

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

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

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

所以我在递归中尝试了它,它确实有效,但不是所有时间.实际上,我有时会出现“Stack Overflow”错误(似乎合适).
这是我的代码,如果你能告诉我什么是错的话会很棒:)

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;
}

谢谢 !

解决方法

如何使用堆栈/队列来管理剩余的工作?
public void Fill(int[,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,point.Value1 + 1,point.Value1,point.Value2 - 1,point.Value2 + 1,initial);        
    }
}

private void EnqueueIfMatches(int[,Queue<Tuple<int,int>> queue,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,y));
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读