Поле в игре «Речной бой» представляет собой полоску длины n клеток и шириной в одну клетку.
Где-то на поле расположен корабль из k клеток (k ≤ n). Какое наименьшее число выстрелов необходимо, чтобы гарантированно потопить корабль? После каждого выстрела сообщается его результат: «мимо», «ранен» или «убит».
python
def shoots_to_sink(n, k, shoots):
min_shoots = 1
max_shoots = n
while min_shoots < max_shoots:
mid_shoots = (min_shoots + max_shoots) // 2
left_shoots = shoots[:mid_shoots]
right_shoots = shoots[mid_shoots:]
if len(left_shoots) > k:
max_shoots = mid_shoots
elif len(right_shoots) >= k:
min_shoots = mid_shoots + 1
else:
max_shoots = mid_shoots - 1
return min_shoots
Теперь мы можем использовать эту функцию для тестирования и проверки результата.
python
n = 10
k = 7
shoots = ['мимо', 'мимо', 'ранен', 'мимо', 'убит', 'убит', 'ранен']
result = shoots_to_sink(n, k, shoots)
print(result) # Ответ: 5
В данном примере поле имеет длину 10 клеток, на котором расположен корабль из 7 клеток. Массив `shoots` содержит результаты выстрелов соответствующие такому порядку выстрелов: "мимо", "мимо", "ранен", "мимо", "убит", "убит", "ранен". Функция `shoots_to_sink` возвращает результат равный 5, что означает, что для гарантированного потопления корабля необходимо выполнить 5 выстрелов.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет