Шахматная доска, парковка, лабиринт, игровое поле, схема зала: действие многих
задач происходит на сетке из клеток, а ввод или ответ — это картинка из
символов: # — стена или машина, . — свободная клетка. В этом уроке собрано то, что
нужно таким задачам снова и снова: сетка в памяти, координаты в том виде, в каком
их дают условия, соседи клетки и подсчёт всех способов что-то расставить.
Сетка из символов
Сетка из символов — это вектор строк: по одной строке на ряд. Строки из
Недели 5 — это ряды символов char, поэтому g[r][c] — символ в строке r,
столбце c:
cin >> g[r] читает целую строку за раз, потому что в ней нет пробелов. Чтобы
нарисовать картинку, начните с сетки, заполненной точками, поставьте символы
на их места и выведите её строка за строкой. string(8, '.') — строка из 8
точек; она создаётся так же, как vector<int>(m) создаёт строку из m нулей:
Рисовать в сетке часто проще, чем решать каждую клетку через if прямо во время
печати: каждая фигура ставит свои отметки, и побеждает последняя поставленная —
поэтому саму фигуру ставьте последней, поверх отметок.
Координаты из условия
Условия описывают клетки по-разному. Шахматную доску обычно задают столбцом, считая слева, и строкой, считая снизу, оба с 1, — а печатаем мы доску с верхней строки. Переводите каждую координату в нашу строку и столбец, обе с 0, сразу после чтения:
| Условие даёт | Строка r (сверху, с 0) | Столбец c (с 0) |
|---|---|---|
строку i сверху и столбец j, обе с 1 | i - 1 | j - 1 |
столбец x слева и строку y снизу на доске 8 × 8 |