419 甲板上的戰艦 dfs, 沉沒戰艦

2021-10-24 13:11:17 字數 1661 閱讀 1761

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

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

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

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

示例 :

x..x

...x

...x

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

無效樣例 :

...x

***x

...x

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

思考

我們打算遍歷這個二維陣列,然後遇到x就開始就記個數。但這樣有個問題,比如又變那一列,3個x其實是一艘戰艦,如果遇上了都數一遍,就會重複數。

所以數過的戰艦需要「沉沒」掉,把"x"變為"."

怎樣探索一艘戰艦包含哪些x呢,注意到戰艦只能橫向或者縱向成一豎。

首先檢查點有沒有越界,是不是在甲板上(x),不是的話直接返回。

符合條件的話:

我們就先將這個點變成".",然後對這個點進行深度優先搜尋,向四周探索。

探索到下乙個x點,就繼續dfs.

下圖注釋

遍歷二維陣列,到(0,0),發現是x。船數+1

就dfs(0,0)

將board[0][0] = "."

然後dfs四周的點。發現左邊和上邊的點越界了,右邊和下邊的點不是x,所以直接返回。

然後遍歷(0,1),  (0,2), 都不是x,沒事

到(0,3)了,它是x,船數+1. dfs(0,3)

首先將board[0][3]置為"."

dfs四周的點。

左邊不是x,上和右邊越界了,直接返回。

dfs(1,3)

沒有越界,且是x

board[1][3] 置為"."

dfs四周

這個時候,左邊上邊都不是x,右邊越界,直接返回。

dfs(2,3)

沒有越界,且是x

board[2][3] 置為"."

左邊,上邊都不是x,下邊和右邊越界,直接返回。

回到主遍歷線,遍歷(1,0), (1,1)......     (2,3),都沒找到x,所以返回戰艦數2

**實現

/**

* @param board

* @return

*/var countbattleships = function(board) }}

function dfs(row, col)

//沉默當前點

board[row][col] = '.'

//對四個方向進行深度優先搜尋

dfs(row-1, col)

dfs(row+1, col)

dfs(row, col-1)

dfs(row, col+1)

}return result

};

Leetcode 419 甲板上的戰艦

給定乙個二維的甲板,請計算其中有多少艘戰艦。戰艦用 x 表示,空位用 表示。你需要遵守以下規則 示例 x.x x x 在上面的甲板中有2艘戰艦。無效樣例 x x x 你不會收到這樣的無效甲板 因為戰艦之間至少會有乙個空位將它們分開。高階 你可以用一次掃瞄演算法,只使用o 1 額外空間,並且不修改甲板...

LeetCode 甲板上的戰艦

給定乙個二維的甲板,請計算其中有多少艘戰艦。戰艦用 x 表示,空位用 表示。你需要遵守以下規則 給你乙個有效的甲板,僅由戰艦或者空位組成。戰艦只能水平或者垂直放置。換句話說,戰艦只能由 1xn 1 行,n 列 組成,或者 nx1 n 行,1 列 組成,其中n可以是任意大小。兩艘戰艦之間至少有乙個水平...

近期的工作成果《帝國戰艦》

最近3個多月一直在做flash小遊戲 帝國戰艦 主要是為參加麻球flash大賽。現在大體功能基本完成,很多遊戲性的東西還沒有加入,時間不夠了。只能先把作品提交了。ai steering程式設計 一.建立機車 ai steering程式設計 二.尋找行為 http bbs.9ria.com threa...