Игра «Морской бой» · Шаг 5 из 5
Где вероятнее
Раненых нет — куда стрелять? Наугад — плохо: корабль в четыре палубы не поместится в узкую щель между промахами, а в середину открытого моря — помещается многими способами. Опытные игроки считают: сколько способов поставить ещё не потопленные корабли проходят через каждую клетку. Где способов больше всего, там и вероятнее всего корабль.
Что сделать
Посчитайте для каждой клетки, сколькими способами через неё можно поставить ещё не потопленные корабли.
Что приходит
izvestno— что известно о море: словарь «клетка →"мимо","ранил"или"убил"»ostalis— длины кораблей, которые ещё не потоплены, например[3, 2, 2, 1]n— сторона моря
Что вернуть
Список из n рядов по n чисел: сколько положений оставшихся кораблей проходят через клетку.
Допишите функцию karta в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В игре
Противник зовёт karta, когда добивать некого, и стреляет в одну из клеток с самым большим числом. Пробел на вашей стороне делает то же для вас. Решите шаг — и противник начнёт находить корабли за считаные выстрелы.
Без этого шага: противник выбирает клетку наугад из всех необстрелянных, не думая, где может стоять корабль.
Пустое море 3 × 3 и один двухпалубный корабль. Положений у него двенадцать: шесть по строкам и шесть по столбцам. Через угловую клетку проходят два из них, через середину стороны — три, через центр — четыре: [[2, 3, 2], [3, 4, 3], [2, 3, 2]].
karta({}, [2], 3)
[[2, 3, 2], [3, 4, 3], [2, 3, 2]]
Положение корабля длины d — как в шаге 1: клетка начала и направление вправо или вниз; у однопалубного — одно положение на клетку. Положение годится, если все его клетки на море и ни одной из них нет в izvestno (никакой — ни «мимо», ни «ранил», ни «убил»).
Для каждого корабля из ostalis — каждый отдельно, даже если длины повторяются, — каждое годное положение прибавляет единицу всем своим клеткам.
Ответ — n рядов по n чисел, ряд s — строка моря s.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.