Сапер - популярная компьютерная игра, в которую вы, вероятно, потратили впустую время, пытаясь выявить ячейки, являющиеся минами, в прямоугольной сетке, основываясь на подсказках о том, сколько соседних мин имеется в каждой не минной ячейке. И если вы еще не играли, сделайте это здесь .
Изящный математический факт о сетке Сапер (aka board) таков:
Доска и ее дополнение имеют одинаковое общее количество шахт . ( Доказательство )
То есть, если у вас есть полностью раскрытая сетка Сапер, сумма всех чисел на этой сетке, то есть общее количество мин , будет равно общему количеству шахты дополнения сетки, то есть сетки, где каждая шахта была заменена с не моим, и каждый не мой заменен на мой.
Например, для сетки Сапер
**1..
34321
*2**1
общее количество мин составляет 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
Дополнение сетки
24***
*****
3*44*
у которого моя общая сумма 2 + 4 + 3 + 4 + 4 = 17 снова.
Напишите программу, которая принимает произвольную сетку Сапер в текстовой форме, где *
представляет мину и 1
сквозную 8
представляет количество мин, примыкающих к ячейке, не относящейся к мине. Вы можете использовать .
или 0
или
(пробел) для представления ячеек без моих соседей, по вашему выбору. Можно предположить, что входная сетка будет правильно помечена, т. Е. Каждая не моя ячейка будет точно обозначать общее количество мин, непосредственно прилегающих к ней ортогонально или по диагонали.
Ваша программа должна напечатать дополнение сетки в том же формате ( с использованием тех же .
, 0
или ,
как вы ожидали на входе).
Самый короткий код в байтах побеждает.
- Вместо программы вы можете написать функцию, которая принимает входную сетку как строку и печатает или возвращает сетку дополнения.
- Конечный символ новой строки на входе или выходе - это хорошо, но не должно быть никаких других символов, кроме тех, которые образуют сетку.
- Вы можете предположить, что сетка 1 × 1 будет самым маленьким входом.
Тестовые случаи
Все входы и выходы можно поменять местами, поскольку дополнением является исходная сетка. Решетки также можно вращать для дальнейших тестовых случаев.
Входные данные:
111
1*1
111
Выход:
***
*8*
***
Входные данные:
.
Выход:
*
Входные данные:
*11*1.1**1...1***1.....1*****1..........
Выход:
1**2***11*****1.1*******1...1***********
Вход: ( пример Cut The Knot )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Выход:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
?
) в строке после последней строки платы, или я могу указать количество строк ввода в командной строке?