Разделить птицу n * m на подполочки a * b - PullRequest
0 голосов
/ 01 сентября 2018

Есть сетка 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. Хотя это не так эффективно, как этот. В этом случае важнее меньше строк кода.

1 Ответ

0 голосов
/ 01 сентября 2018

Давайте использовать по модулю арифметики :

  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 .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...