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 猪猪🐷 阅读(135) 评论(0) 收藏 举报
浙公网安备 33010602011771号