419. Battleships in a Board

Given an 2D board, count how many battleships are in it. The battleships are represented with 'X's, empty slots are represented with '.'s. You may assume the following rules:
* You receive a valid board, made of only battleships or empty slots.
* Battleships can only be placed horizontally or vertically. In other words, they can only be made of the shape 1xN (1 row, N columns) or Nx1 (N rows, 1 column), where N can be of any size.
* At least one horizontal or vertical cell separates between two battleships - there are no adjacent battleships.
Example:

X..X
...X
...X
In the above board there are 2 battleships.
Invalid Example:

...X
XXXX
...X
This is an invalid board that you will not receive - as battleships will always have a cell separating between them.



Follow up:
Could you do it in one-pass, using only O(1) extra memory and without modifying the value of the board?




class Solution {
    private static final int[][] dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
    public int countBattleships(char[][] board) {
        int count = 0;
        for(int i = 0; i < board.length; i++){
            for(int j = 0; j < board[0].length; j++){
                if(board[i][j] == 'X'){
                    dfs(board, i, j);
                    count++;
                }
            }
        }
        for(int i = 0; i < board.length; i++){
            for(int j = 0; j < board[0].length; j++){
                if(board[i][j] == 'V') board[i][j] = 'X';
            }
        }
        return count;
    }
    private void dfs(char[][] board, int i, int j){
        board[i][j] = 'V';
        for(int[] dir : dirs){
            int x = i + dir[0];
            int y = j + dir[1];
            // check boundary 
            if(x < 0 || y < 0 || x >= board.length || y >= board[0].length || board[x][y] != 'X') continue;
            dfs(board, x, y);
        }  
    }
}

 

posted on 2018-11-08 16:38  猪猪&#128055;  阅读(135)  评论(0)    收藏  举报

导航