【问题标题】:Visit neighbor of a position in a 2d-array访问二维数组中某个位置的邻居
【发布时间】:2024-04-27 18:10:02
【问题描述】:

我有以下二维数组:

static int[,] arr = new int[5, 5] 
{ 
    { 00, 00, 00, 01, 00 },
    { 00, 00, 01, 01, 00 },
    { 00, 00, 01, 01, 00 },
    { 00, 00, 01, 01, 00 },
    { 00, 00, 00, 01, 00 },
};

我必须实现一个名为 Hit(int x, int y) 的方法。当我们在数组中击中一个 0 时(即 Hit(0, 0), Hit(1, 1),但不是 Hit(3, 0)),我希望所有与我们击中的零相邻的零都增加 10 .所以如果我调用Hit(1, 1),数组应该变成下面这样。

static int[,] arr = new int[5, 5] 
{ 
    { 10, 10, 10, 01, 00 },
    { 10, 10, 01, 01, 00 },
    { 10, 10, 01, 01, 00 },
    { 10, 10, 01, 01, 00 },
    { 10, 10, 10, 01, 00 },
};

知道如何实现吗?在我看来,深度优先搜索/递归排序算法应该可以完成这项工作,但我无法为二维数组实现它。

感谢您的帮助!

【问题讨论】:

  • 能否提供更多示例?

标签: c# algorithm multidimensional-array


【解决方案1】:

我个人认为用递归方法来做这件事很奇怪。我只是将其视为图像处理任务并在整个数组中运行过滤器。

【讨论】:

    【解决方案2】:

    我会说你应该能够使用递归方法来做到这一点。

    类似

        private void Hit(int[,] arr, int x, int y)
        {
            if (    
                    x < 0 ||
                    x + 1 > arr.GetLongLength(0)||
                    y < 0 ||
                    y + 1 > arr.GetLongLength(1)
                )
                return;
            if (arr[x, y] == 0)
            {
                arr[x, y] += 10;
                Hit(arr, x, y + 1);
                Hit(arr, x + 1, y + 1);
                Hit(arr, x + 1, y);
                Hit(arr, x + 1, y - 1);
                Hit(arr, x, y - 1);
                Hit(arr, x - 1, y - 1);
                Hit(arr, x - 1, y);
            }
        }
    

    【讨论】:

      【解决方案3】:

      您正在寻找的是Flood fill 算法,您可以通过多种方式实现该算法,从DFS(查看堆栈)到BFS

      您也可以稍微收紧代码,但这里是我要做的粗略草图(使用 DFS):

      int[] dx = { 1, 1, 1, 0, 0, -1, -1, -1 };
      int[] dy = { 1, 0, -1, 1, -1, 1, -1, 0 };
      void Hit( int x, int y ) {
          if ( board[x,y] == 0 ) {
              board[x,y] = 10;
              for ( int i = 0; i < 8; i++ ) {
                  nx = x + dx[i];
                  ny = y + dy[i];
      
                  // if nx, ny is in bound
                  if ( nx >= 0 && nx < height && ny >= 0 && ny < height )
                      Hit( nx, ny );
              }
          }
      }
      

      【讨论】: