Day 19:419. 甲板上的战舰

59 阅读1分钟

Leetcode 419. 甲板上的战舰

给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' ,返回在甲板 board 上放置的 战舰 的数量。

战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。

image.png

扫描整个矩阵。遇到战舰,就判断它所在的一行/列连续的是否还有其他战舰,遇到战舰就把设置为已经扫描过的。
先扫描行还是先扫描列都可以,但是,如果扫描行的时候后面有连续的组成战舰,就不能再扫描列了。
避免出现以下情况少算了了。
image.png

完整代码

class Solution {
    public int countBattleships(char[][] board) {
        int res = 0;
        int m = board.length;
        int n = board[0].length;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 'X') {
                    res++;
                    board[i][j] = '.';
                    // 列
                    if (((i + 1) < m) && (board[i + 1][j] == 'X')) {
                        int t = i + 1;
                        while (t < m && board[t][j] == 'X') {
                            board[t][j] = '.';
                            t++;
                        }
                        continue;
                    }
                    // 行
                    if (((j + 1) < n) && (board[i][j + 1] == 'X')) {
                        int t = j + 1;
                        while (t < n && board[i][t] == 'X') {
                            board[i][t] = '.';
                            t++;
                        }
                        continue;
                    }
                }
            }
        }
        return res;
    }
}