Разбор задачи: Линкоры на доске

Предложенный нами код решения:

 def countBattleships(board):
    """
    :type board: List[List[str]]
    :rtype: int
    """
    count = 0
    for i in range(len(board)):
        for j in range(len(board[0])):
            if board[i][j] == 'X':
                # Условие, чтобы текущая клетка была началом корабля
                if (i == 0 or board[i-1][j] != 'X') and (j == 0 or board[i][j-1] != 'X'):
                    count += 1
    return count

Пошаговый разбор кода

def countBattleships(board):
    """
    :type board: List[List[str]]
    :rtype: int
    """
    count = 0
  1. Инициализация счётчика кораблей:
    Переменная count будет хранить количество найденных кораблей. Начальное значение — 0.

    for i in range(len(board)):
        for j in range(len(board[0])):
  1. Двойной цикл для обхода всей матрицы:
    Внешний цикл проходит по строкам (индекс i), внутренний — по столбцам (индекс j).

            if board[i][j] == 'X':
  1. Проверка текущей ячейки:
    Если в текущей ячейке находится 'X', это потенциальное начало нового корабля.

                if (i == 0 or board[i-1][j] != 'X') and (j == 0 or board[i][j-1] != 'X'):
                    count += 1
  1. Проверка начала нового корабля:

    • i == 0: Проверяем, является ли текущая ячейка первой строкой.
    • board[i-1][j] != 'X': Если ячейка не в первой строке, проверяем, что сверху нет продолжения корабля.
    • j == 0: Проверяем, является ли текущая ячейка первым столбцом.
    • board[i][j-1] != 'X': Если ячейка не в первом столбце, проверяем, что слева нет продолжения корабля.

    Если выполнены оба условия (сверху и слева нет продолжения), значит текущая ячейка — это начало нового корабля. Увеличиваем счётчик count.


    return count
  1. Возврат результата:
    После обхода всей матрицы возвращаем общее количество кораблей.

Пример работы алгоритма

  1. Пример 1

    board = [
        ["X", ".", ".", "X"],
        [".", ".", ".", "X"],
        [".", ".", ".", "X"]
    ]
    • Начинаем с первой строки:
      • Первая ячейка (board[0][0] = 'X') — начало нового корабля.
      • Четвёртая ячейка (board[0][3] = 'X') — начало нового корабля.
    • Переходим ко второй строке:
      • Все ячейки либо пустые ("."), либо являются продолжением корабля из первой строки.
    • Переходим к третьей строке:
      • Все ячейки либо пустые, либо являются продолжением корабля из первой строки.

    Результат: 2 корабля.


  1. Пример 2

    board = [["."]]
    • Матрица состоит из одной ячейки, которая пуста. Результат: 0 кораблей.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии