Поле в игре «Речной бой» представляет собой полоску длины n
клеток и шириной в одну клетку. Где‑то на поле расположен корабль из k
клеток (k≤n
). Какое наименьшее число выстрелов необходимо, чтобы гарантированно потопить корабль? После каждого выстрела сообщается его результат: «мимо», «ранен» или «убит».
function randomShipPlacement(n, k) {
// Создаем массив полей с длиной n и заполняем их нулями
let field = Array(n).fill(0);
// Генерируем случайный индекс для размещения корабля
let index = Math.floor(Math.random() * (n - k + 1));
// Расставляем 1 в ячейках, занимаемых кораблем
for (let i = index; i < index + k; i++) {
field[i] = 1;
}
return field;
}
Затем создадим функцию, которая будет принимать поле и координату выстрела и будет возвращать результат выстрела: "мимо", "ранен" или "убит".
function fire(field, coordinate) {
// Проверяем значение ячейки поля по координате выстрела
// Если значение равно 1, то корабль "ранен"
if (field[coordinate] === 1) {
// Заменяем 1 на 0, чтобы отметить "ранение" корабля
field[coordinate] = 0;
// Проверяем, остались ли еще ячейки с кораблем
if (field.includes(1)) {
return "ранен";
} else {
return "убит";
}
} else {
return "мимо";
}
}
Теперь у нас есть все необходимые функции для решения задачи. Мы можем создать функцию, которая будет принимать длину поля (n) и длину корабля (k) и будет определять количество выстрелов, необходимых, чтобы гарантированно потопить корабль.
function findMinimumShots(n, k) {
// Случайно расставляем корабль
let field = randomShipPlacement(n, k);
let shots = 0;
// Проверяем, остались ли ячейки с кораблем
while (field.includes(1)) {
// Генерируем случайную координату выстрела
let coordinate = Math.floor(Math.random() * n);
// Выполняем выстрел и увеличиваем счетчик выстрелов
fire(field, coordinate);
shots++;
}
return shots;
}
Теперь мы можем вызвать функцию findMinimumShots с заданными значениями n и k и получить ответ:
let n = 10;
let k = 3;
let minimumShots = findMinimumShots(n, k);
console.log(minimumShots);
Очевидно, что в худшем случае, мы можем расположить корабль на одном конце поля и делать выстрелы последовательно по каждой клетке. Поэтому количество выстрелов, необходимых для гарантированного потопления корабля, будет равно n - k + 1.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет