zoukankan      html  css  js  c++  java
  • 419. Battleships in a Board

    Given an 2D board, count how many different 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?

     FOLLOW UP

        //little tricky way only care about the left and up case
        public int countBattleships(char[][] board) {
           if(board == null || board.length == 0) return 0;
           int row = board.length;
           int col = board[0].length;
           int res = 0;
           for(int i = 0; i < row ; i++){
               for(int j = 0; j < col ; j++){
                   if(board[i][j] == 'X'){
                       if(i > 0 && board[i-1][j] == 'X') continue;
                       if(j > 0 && board[i][j-1] == 'X') continue;
                       res++;
                   }
               }
           }
           return res;
        
        }

    DFS

    public class Solution {
        public int countBattleships(char[][] board) {
           if(board == null || board.length == 0) return 0;
           int row = board.length;
           int col = board[0].length;
           int res = 0;
           for(int i = 0; i < row ; i++){
               for(int j = 0; j < col ; j++){
                   if(board[i][j] == 'X'){
                       dfs(board , i, j);
                       res++;
                   }
               }
           }
           return res;
        }
        public void dfs(char[][] board, int i, int j){
            if(i < 0 || i >= board.length || j < 0 || j >=board[0].length || board[i][j] == '.'){
                return;
            }
            board[i][j] = '.';
            dfs(board , i+1, j);
            dfs(board , i, j+1);
            dfs(board , i-1, j);
            dfs(board , i, j-1);
        }
    }
  • 相关阅读:
    特征向量的意义
    双线性插值原理和实现
    C语言中float double等类型在内存中的存储
    实现大小端之间的转换宏,包括32位和64位的数
    C语言运算符优先级列表(超级详细的---转载加自己习题)
    printf输出结果的判断
    C语言中定义变量的先后顺序和为变量分配内存的顺序
    C 中细节问题的试题
    Hadoop学习之HBase的伪分布式安装
    Hadoop学习之ZooKeeper理论知识和集群安装配置
  • 原文地址:https://www.cnblogs.com/joannacode/p/6108135.html
Copyright © 2011-2022 走看看