首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何打开用户在扫雷机中选择的单元格?

如何打开用户在扫雷机中选择的单元格?
EN

Stack Overflow用户
提问于 2022-09-12 02:23:47
回答 1查看 40关注 0票数 0

我需要在我使用C#的扫雷船的渲染中,打开用户选择的单元格。用户输入坐标I.1,3,程序“打开”该单元格,它要么显示一个指示其周围炸弹的数字,要么显示一个空字段(如扫雷器!)。我应该如何解决这个问题,使细胞和它附近的每个细胞打开,如果是空的?

代码语言:javascript
复制
//Opens cells if there is no bomb 
        public bool Open(int row, int column)
        {
            bool result = false;
            if (row >= 0 && row < Dimension && column >= 0 && column < Dimension)
            {
                if (!cells[row, column].Open)
                {
                    cells[row, column].Open = true;

                    result = true;
                }

            }

            return result;
        }

“”“

EN

回答 1

Stack Overflow用户

发布于 2022-09-12 02:30:39

最简单的解决方案是递归调用每个相邻单元的Open函数。由于Open函数已经检查无效/打开单元格,因此无需在递归调用之前进行预检查。

代码语言:javascript
复制
if (cells[row, column].Empty)
{
    Open(row - 1, column - 1);
    Open(row - 1, column);
    Open(row - 1, column + 1);
    Open(row, column - 1);
    Open(row, column + 1);
    Open(row + 1, column - 1);
    Open(row + 1, column);
    Open(row + 1, column + 1);
}

如果需要非递归方法,则可以使用宽度优先搜索之类的方法。

代码语言:javascript
复制
public bool Open(int row, int column)
{
    bool result = false;
    if (row >= 0 && row < Dimension && column >= 0 && column < Dimension)
    {
        if (!cells[row, column].Open)
        {
            cells[row, column].Open = true;

            if (cells[row, column].Empty)
            {
                var bfs = new Queue<(int Row, int Column)>()
                bfs.Enqueue((row, column));
                while (bfs.Count > 0)
                {
                    (int r, int c) = bfs.Dequeue();
                    int rb = r - 1;
                    if (rb < 0) rb = r;
                    int re = r + 1;
                    if (re >= Dimension) re = r;
                    int cb = c - 1;
                    if (cb < 0) cb = c;
                    int ce = c + 1;
                    if (ce >= Dimension) ce = c;
                    for (int i = rb; i <= re; i++)
                    {
                        for (int j = cb; j <= ce; j++)
                        {
                            if (!cells[i, j].Open)
                            {
                                cells[i, j].Open = true;
                                if (cells[i, j].Empty) bfs.Enqueue((i, j));
                            }
                        }
                    }
                }
            }

            result = true;
        }

    }

    return result;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73683936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档