来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/battleships-in-a-board
【题目描述】
给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ ,返回在甲板 board 上放置的 战舰 的数量。
战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。
【示例】
示例 1:
输入:board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
输出:2
示例 2:
输入:board = [["."]]
输出:0
提示:
- m == board.length
- n == board[i].length
- 1 <= m, n <= 200
- board[i][j] 是 ‘.’ 或 ‘X’
【解题思路】
在board
的最后一行和最后一列之后添加一行和一列,值为'.'
,以防止遍历时越界;定义变量num
,用于累计战舰数量。
逐行遍历每个单元格,对于单元格board[i][j]
,如果该单元格的值为'X'
且其右方和下方的单元格的值为'.'
,即board[i][j]=='X' and board[i+1][j] == board[i][j+1] == '.'
,说明该单元格是有效战舰,故战舰数量加一,即num=num+1
,否则继续遍历。
最终的num
即为战舰的数量。
注:
- 遍历是从上到下从左到右,当遍历到单元格
board[i][j]
时,其上方和左方的单元格已经被遍历过了,所以只需比较下方和右方的单元格即可; - 如果
board[i][j]=='X'
,而board[i+1][j] or board[i][j+1] != '.'
,说明其相邻单元格还有'X'
,即该单元格并不是战舰的最后一个'X'
,故不能作为有效战舰;反之,如果board[i][j]=='X'
,且board[i+1][j] or board[i][j+1] == '.'
,说明这是一艘战舰的最后一个值为'X'
的单元格,故可以作为有效战舰。
【提交代码】
class Solution:
def countBattleships(self, board: List[List[str]]) -> int:
row_n = len(board[0])
col_n = len(board)
for i in range(col_n):
board[i].append('.')
board.append(['.']*(row_n+2))
num = 0
for i in range(col_n+1):
for j in range(row_n+1):
if board[i][j]=='X' and board[i+1][j] == board[i][j+1] == '.':
num += 1
return num
【运行结果】