实现泛洪填充以检查组 - Java

时间:2013-09-22 06:45:41

标签: java recursion stack-overflow flood-fill

我一直在查看这个泛洪填充实现一段时间,并继续遇到可怕的堆栈溢出。我在12x10网格上随机丢弃碎片并在每个随机碎片放下后调用checkMatches方法检查三个或更多的组,从而使用洪水填充。

编辑:见评论

public void checkMatches(int x, int y, int type)
{
    if (x < 0 || x >= PIECES_WIDE || y < 0 || y >= PIECES_TALL || type == 0)
        return;
    if (grid[x][y].getType() != type)
        return;

    int checkL = x;
    while (checkL >= 0 && grid[checkL][y].getType() == type)
    {
        grid[checkL][y].setDestroy(true);
        numMatches++;
        checkL--;
    }
    checkL++;

    int checkR = x;
    while (checkR < PIECES_WIDE - 1 && grid[checkR][y].getType() == type)
    {
        grid[checkR][y].setDestroy(true);
        numMatches++;
        checkR++;
    }
    checkR--;

    for (int i = checkL; i <= checkR; i++)
    {
        if (y > 0 && grid[i][y - 1].getType() == type)
            checkMatches(i, y - 1, type);
        if (y < PIECES_TALL - 1 && grid[i][y + 1].getType() == type)
            checkMatches(i, y + 1, type);
    }

}

然后调用该方法的相关代码如果有三个匹配的部分则销毁这些部分:

    checkMatches(x, y, type);
    if (numMatches >= 3)
    {
        for (int i = 0; i < PIECES_WIDE; i++)
        {
            for (int j = 0; j < PIECES_TALL; j++)
            {
                if (grid[i][j].isDestroy())
                    destroyPiece(grid[i][j]);
            }
        }
    } else
    {
        numMatches = 0;
        for (int i = 0; i < PIECES_WIDE; i++)
        {
            for (int j = 0; j < PIECES_TALL; j++)
            {
                grid[i][j].setDestroy(false);
            }
        }
    }

我的眼睛和大脑受伤了。我知道递归导致溢出,但我也知道这种实现可能以某种形式出现。因此,我做错了什么。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您需要在已找到匹配的部分上添加标记。然后你可以做一个循环来扩展你的匹配,直到你注意到没有更多的标记被标记。然后你可以停下来。