日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 战舰_419. 甲板上的战舰(Python)

發布時間:2024/1/8 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 战舰_419. 甲板上的战舰(Python) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

難度:★★★☆☆

類型:二維數組

方法:深度優先搜索

力扣鏈接請移步本題傳送門

更多力扣中等題的解決方案請移步力扣中等題目錄

給定一個二維的甲板, 請計算其中有多少艘戰艦。 戰艦用 'X'表示,空位用 '.'表示。 你需要遵守以下規則:

給你一個有效的甲板,僅由戰艦或者空位組成。

戰艦只能水平或者垂直放置。換句話說,戰艦只能由 1xN (1 行, N 列)組成,或者 Nx1 (N 行, 1 列)組成,其中N可以是任意大小。

兩艘戰艦之間至少有一個水平或垂直的空位分隔 - 即沒有相鄰的戰艦。

示例 :

X..X

...X

...X

在上面的甲板中有2艘戰艦。

無效樣例 :

...X

XXXX

...X

你不會收到這樣的無效甲板 - 因為戰艦之間至少會有一個空位將它們分開。

進階:

你可以用一次掃描算法,只使用O(1)額外空間,并且不修改甲板的值來解決這個問題嗎?

解答

這道題與統計島嶼數目是一樣的。

解法1,我們可以采用深度優先搜索算法來實現,遍歷每個元素,如果遇到戰艦,則用深度優先搜索將戰艦抹去,同時計數器+1。

class Point:

"""

點的實例,包含獲取左邊、右邊、上邊、下邊相鄰點和獲取當前坐標值的方法。

"""

def __init__(self, h, w):

self.h = h

self.w = w

@property

def left(self):

return Point(self.h, self.w-1)

@property

def right(self):

return Point(self.h, self.w+1)

@property

def upper(self):

return Point(self.h-1, self.w)

@property

def lower(self):

return Point(self.h+1, self.w)

@property

def locate(self):

return [self.h, self.w]

class Board:

"""

網格實例,用于構建網格,包含取某點值,設置某點值,判斷點是否在網格內等方法。

"""

def __init__(self, value):

value = value if value else [[]]

self.value = value

self.height = len(value)

self.width = len(value[0])

def get(self, point):

assert isinstance(point, Point)

if self.is_valid(point):

return self.value[point.h][point.w]

return -1

def set(self, point, value):

assert isinstance(point, Point)

if self.is_valid(point):

self.value[point.h][point.w] = value

return True

return -1

def is_valid(self, point):

assert isinstance(point, Point)

return 0 <= point.w < self.width and 0 <= point.h < self.height

class Deck:

def __init__(self, value):

self.deck = Board(value)

self.width = self.deck.width

self.height = self.deck.height

@property

def warship(self):

s = 0

def erase(point):

if self.deck.get(point) == 'X':

self.deck.set(point, '.')

erase(point.left)

erase(point.right)

erase(point.upper)

erase(point.lower)

for i in range(self.height):

for j in range(self.width):

if self.deck.get(Point(i, j)) == 'X':

s += 1

erase(Point(i, j))

return s

class Solution:

def countBattleships(self, board):

deck = Deck(board)

return deck.warship

if __name__ == "__main__":

s = Solution()

data = [['X', '.', '.', 'X',],

['.', '.', '.', 'X',],

['.', '.', '.', 'X',],

]

print(s.countBattleships(data))

解法2:我們也可以統計所有左上相鄰元素均為“.”的“X”的個數,就是戰艦的個數。

class Solution:

def countBattleships(self, board):

height, width = len(board), len(board[0])

s = 0

for h in range(height):

for w in range(width):

if board[h][w] == 'X' and (h == 0 or board[h-1][w] == '.') and (w == 0 or board[h][w-1] == '.'):

s += 1

return s

精簡版一行代碼實現:

class Solution:

def countBattleships(self, board):

return sum([board[h][w] == 'X' and (h == 0 or board[h-1][w] == '.') and (w == 0 or board[h][w-1] == '.') for w in range(len(board[0])) for h in range(len(board))])

如有疑問或建議,歡迎評論區留言~

有關更多力扣中等題的python解決方案,請移步力扣中等題解析

總結

以上是生活随笔為你收集整理的python 战舰_419. 甲板上的战舰(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。