zoukankan      html  css  js  c++  java
  • [LeetCode] 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?

    使用DFS来遍历board

    如果遇到X并标记,并沿水平和垂直方向继续遍历,

    如果遇到.直接返回。

    class Solution {
    public:
        int countBattleships(vector<vector<char>>& board) {
            if (board.empty())
                return 0;
            // Count battleships
            int res = 0;
            int m = board.size(), n = board[0].size();
            vector<vector<bool>> visited(m, vector<bool>(n, false));
            // Traversal board and judge battleships.
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (!visited[i][j] && board[i][j] == 'X') {
                        dfs(board, visited, i, j);
                        res += 1;
                    }
                }
            }
            return res;
        }
        
        void dfs(vector<vector<char>>& board, vector<vector<bool>>& visited, int i, int j) {
            if (visited[i][j] == true)
                return;
            visited[i][j] = true;
            if (board[i][j] == '.') {
                return;
            }
            else {
                if (i + 1 < board.size() && board[i + 1][j] == 'X') 
                    dfs(board, visited, i + 1, j);
                if (j + 1 < board[0].size() && board[i][j + 1] == 'X') 
                    dfs(board, visited, i, j + 1);
            }
            return;
        }
    };
    // 9 ms
  • 相关阅读:
    迷上了塔防游戏Desktop Tower Defense 1.5
    魔方成长路线
    排名进1000
    终于造完了863项目的预算
    利用supermemo背单词达到3000词条
    被Colorgraphic古老的Xentera多屏显卡折腾得不轻
    队式桥牌赛总结(20080503)
    在IIS上设置Gzip压缩设置(备忘)
    警惕使用WebClient.DownloadFile(string uri,string filePath)方法
    WebClient.UploadValues Post中文乱码的解决方法
  • 原文地址:https://www.cnblogs.com/immjc/p/8301428.html
Copyright © 2011-2022 走看看