【问题标题】:Split a gird n*m to sub-girds a*b将网格 n*m 拆分为子网格 a*b
【发布时间】:2018-08-31 21:08:00
【问题描述】:

有一个 9*9 的网格,我想把它分成 9 个 3*3 的网格。

char[][] grid = new[]
{
    new[] {'.', '.', '.', '1', '4', '.', '.', '2', '.'}, 
    new[] {'.', '.', '6', '.', '.', '.', '.', '.', '.'},
    new[] {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
    new[] {'.', '.', '1', '.', '.', '.', '.', '.', '.'},
    new[] {'.', '6', '7', '.', '.', '.', '.', '.', '9'},
    new[] {'.', '.', '.', '.', '.', '.', '8', '1', '.'},
    new[] {'.', '3', '.', '.', '.', '.', '.', '.', '6'},
    new[] {'.', '.', '.', '.', '.', '7', '.', '.', '.'},
    new[] {'.', '.', '.', '5', '.', '.', '.', '7', '.'}
};

这是我的有效解决方案:

List<char[][]> myList = new List<char[][]>();
for (int i = 0; i < 9; i = i + 3)
    {
    for (int j = 0; j < 9; j = j + 3)
    {
        List<char[]> temp1 = new List<char[]>();
        for (int k = 0; k < 3; k++)
        {
            List<char> temp2 = new List<char>();
            for (int l = 0; l < 3; l++)
            {
                temp2.Add(grid[i + k][j + l]);
            }
            temp1.Add(temp2.ToArray());
        }
        myList.Add(temp1.ToArray());
    }
}

寻找更简单的方法,特别是 Linq 解决方案。尽管它没有这个效率那么高。在这种情况下,更少的代码行更重要。

【问题讨论】:

  • 您可以使用i % 3 == 0 获取每三个元素,并在两个循环中完成所有操作。一个循环遍历每个数组,一个检查它是否是第三个元素并相应地拆分。
  • 您对要“拆分”数组的位置有偏好吗?

标签: c# arrays list linq grid


【解决方案1】:

让我们使用模运算

  int size = 3; 

  var grids = Enumerable
    .Range(0, 9)
    .Select(index => grid            
      .Skip(index / size * size)     // Y coordinates 0..2, 3..5, 6..8
      .Take(size)
      .Select(line => line
         .Skip(index % size * size)  // X coordinates 0..2, 3..5, 6..8
         .Take(size))
         .ToArray()
      .ToArray())
    .ToArray(); // final materialization into char[][][] (if required)

测试:

  string report = string.Join(Environment.NewLine + Environment.NewLine, grids
    .Select(cell => string.Join(Environment.NewLine, cell
       .Select(line => string.Join(" ", line)))));

  Console.WriteLine(report);

结果:

. . .
. . 6
. . .

1 4 .
. . .
. . .

. 2 .
. . .
. . .

. . 1
. 6 7
. . .

. . .
. . .
. . .

. . .
. . 9
8 1 .

. 3 .
. . .
. . .

. . .
. . 7
5 . .

. . 6
. . .
. 7 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2018-10-21
    • 2012-01-28
    • 2015-01-31
    • 2019-08-28
    相关资源
    最近更新 更多