zoukankan      html  css  js  c++  java
  • [Swift]LeetCode419. 甲板上的战舰 | Battleships in a Board

    原文地址:https://www.cnblogs.com/strengthen/p/10333099.html 

    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?


    给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X'表示,空位用 '.'表示。 你需要遵守以下规则:

    • 给你一个有效的甲板,仅由战舰或者空位组成。
    • 战舰只能水平或者垂直放置。换句话说,战舰只能由 1xN (1 行, N 列)组成,或者 Nx1 (N 行, 1 列)组成,其中N可以是任意大小。
    • 两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。

    示例 :

    X..X
    ...X
    ...X
    

    在上面的甲板中有2艘战舰。

    无效样例 :

    ...X
    XXXX
    ...X
    

    你不会收到这样的无效甲板 - 因为战舰之间至少会有一个空位将它们分开。

    进阶:

    你可以用一次扫描算法,只使用O(1)额外空间,并且不修改甲板的值来解决这个问题吗?


    20ms

     1 class Solution {
     2     func countBattleships(_ board: [[Character]]) -> Int {
     3         
     4         var battle = 0
     5         
     6         for r in 0..<board.count{
     7             
     8             for c in 0..<board[0].count{
     9                 
    10                 if board[r][c] == "X"{
    11                     var cellLeft = "."
    12                     var cellUp = "."
    13                     if c > 0 {
    14                         cellLeft = String(board[r][c-1])
    15                     }
    16                     if r > 0{
    17                         cellUp = String(board[r-1][c])
    18                     }
    19                     
    20                     if cellUp == "." && cellLeft == "."{
    21                         battle += 1
    22                     }
    23                 }
    24                 
    25             }
    26         }
    27         
    28         return battle
    29     }
    30 }

    28ms

     1 class Solution {
     2     func countBattleships(_ board: [[Character]]) -> Int {
     3         guard !board.isEmpty && !board[0].isEmpty else {
     4             return 0
     5         }
     6 
     7         var board = board
     8         let xChar = Character("X")
     9         let dotChar = Character(".")
    10         var result = 0
    11         for row in 0..<board.count {
    12             for column in 0..<board[0].count {
    13                 let char = board[row][column]
    14                 if char != xChar {
    15                     continue
    16                 }
    17 
    18                 board[row][column] = dotChar
    19                 if row < board.count - 1 && board[row + 1][column] == xChar {
    20                     var row2 = row + 1
    21                     while row2 <= board.count - 1 && board[row2][column] == xChar {
    22                         board[row2][column] = dotChar
    23                         row2 += 1
    24                     }
    25                 } else if column < board[0].count - 1 && board[row][column + 1] == xChar {
    26                     var column2 = column + 1
    27                     while column2 <= board[0].count - 1 && board[row][column2] == xChar {
    28                         board[row][column2] = dotChar
    29                         column2 += 1
    30                     }
    31                 }
    32                 
    33                 result += 1
    34             }
    35         }
    36 
    37         return result
    38     }
    39 }

    152ms

     1 class Solution {
     2     func countBattleships(_ board: [[Character]]) -> Int {
     3         let row = board.count
     4         guard row > 0 else {
     5             return 0
     6         }
     7         let column = board[0].count
     8         var num = 0
     9         
    10         for i in 0..<row {
    11             for j in 0..<column {
    12                 if board[i][j] == "X" && (i == 0 || board[i - 1][j] != "X") && (j == 0 || board[i][j - 1] != "X") {
    13                     num += 1
    14                 }
    15             }
    16         }
    17         return num
    18     }
    19 }

    172ms

     1 class Solution {
     2     func countBattleships(_ board: [[Character]]) -> Int {
     3         var board = board
     4         if board.isEmpty || board[0].isEmpty {return 0}
     5         var m:Int = board.count
     6         var n:Int = board[0].count
     7         var res:Int = 0
     8         var visited:[[Bool]] = [[Bool]](repeating:[Bool](repeating:false,count:n),count:m)
     9         for i in 0..<m
    10         {
    11             for j in 0..<n
    12             {
    13                 if board[i][j] == "X" && !visited[i][j]
    14                 {
    15                     var vertical:Int = 0
    16                     var horizontal:Int = 0
    17                     dfs(&board, &visited, &vertical, &horizontal, i, j)
    18                     if vertical == i || horizontal == j
    19                     {
    20                         res += 1
    21                     }
    22                 }                
    23             }           
    24         }
    25         return res
    26     }
    27     
    28     func dfs(_ board:inout [[Character]],_ visited:inout[[Bool]],_ vertical:inout Int,_ horizontal:inout Int,_ i:Int,_ j:Int)
    29     {
    30         var m:Int = board.count
    31         var n:Int = board[0].count
    32         if i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || board[i][j] == "."
    33         {
    34             return
    35         }
    36         vertical |= i
    37         horizontal |= j
    38         visited[i][j] = true
    39         dfs(&board, &visited, &vertical, &horizontal, i - 1, j)
    40         dfs(&board, &visited, &vertical, &horizontal, i + 1, j)
    41         dfs(&board, &visited, &vertical, &horizontal, i, j - 1)
    42         dfs(&board, &visited, &vertical, &horizontal, i, j + 1)
    43     }
    44 }
  • 相关阅读:
    【转】Intellij IDEA常用配置详解
    scala(一)
    scala(三)
    Scrapy学习篇(六)之Selector选择器
    Scrapy学习篇(五)之Spiders
    Scrapy学习篇(四)之数据存储
    Scrapy学习篇(三)之创建项目
    Scrapy学习篇(二)之常用命令行工具
    Scrapy学习篇(一)之框架
    git实现github仓库和本地仓库同步
  • 原文地址:https://www.cnblogs.com/strengthen/p/10333099.html
Copyright © 2011-2022 走看看