在由 1 x 1 方格組成的 n x n 網格 grid 中,每個 1 x 1 方塊由 /、\ 或空格構成。這些字元會將方塊劃分為一些共邊的區域。這道題本質上是計算連通分量個數,難點在於理解題意以及確定哪些元素是相連的.(請注意,反斜槓字元是轉義的,因此 \ 用 「\」 表示。)。
返回區域的數目。
*********************************************
示例 1:
輸入:[
" /",
「/ "
]輸出:2
解釋:2x2 網格如下:
示例 2:
輸入:[
" /」,
" "]
輸出:1
解釋:2x2 網格如下:
示例 3:
輸入:[
「\/」,
「/\」
]輸出:4
解釋:(回想一下,因為 \ 字元是轉義的,所以 「\/」 表示 /,而 「/\」 表示 /\。)
2x2 網格如下:
示例 4:
輸入:[
「/\」,
「\/」
]輸出:5
解釋:(回想一下,因為 \ 字元是轉義的,所以 「/\」 表示 /\,而 「\/」 表示 /。)
2x2 網格如下:
示例 5:
輸入:[
「//」,
"/ "
]輸出:3
解釋:2x2 網格如下:
grid[i][j] 是 『/』、』』、或 』 '。
理解題意:
題目使用字串表示對正方形的劃分,若grid.length == n
,則表示將當前單元格劃分為n
2n^2
n2個小正方形單元格,然後在將每乙個小正方形單元格劃分兩個三角形.如果使用/
劃分,則當前小正方形被劃分為左上,右下兩個三角形,如果使用\
劃分,則當前三角形被劃分為左下,右上兩個三角形.如果使用空格,則表示不對當前小正方形進行劃分.題目要求判斷劃分的區域個數,實際上就是要求計算所有小三角形中的連通分量個數.
判斷連通性:
注意到乙個小三角形可能屬於一下四種方位之一,左下,左上,右下,右上.對於未被劃分的小三角形,可以將其視作左上,右下劃分,不過這兩個小三角形是連通的.如果當前小正方形使用/
或\
劃分,則被劃分後的兩個小三角形不是連通的.對於每乙個小三角形,除與其位於同一正方形的三角形外,其最多與周圍兩個三角形連通.例如,位於左下的三角形,如果其左側有正方形,則其與左側正方形的乙個三角形相連通(右上或右下),如果其下方有正方形,則其餘下方正方形的乙個三角形相連通(左上或右上).
在理解以上兩點後,我們便可以考慮如何計算圖中的連通分量個數,此處我們使用並查集計算圖中的連通分量個數.
class
solution
//判斷給定的方位是否為左側,左上或左下
private
boolean
isleft
(int x)
private
boolean
isright
(int x)
private
boolean
isup
(int x)
private
boolean
isdown
(int x)
//使用並查集將當前位置grid[i][j][k]處的三角形與其相鄰的兩個三角形進行相連
private
void
unionadj
(unionfind uf,
int[
] grid,
int i,
int j,
int k)
if(i >0)
}else
if(grid[i]
[j][k]
== left_down)
if(i < grid.length-1)
}else
if(grid[i]
[j][k]
== right_up)
if(j < grid.length-1)
}else
if(grid[i]
[j][k]
== right_down)
if(j < grid.length-1)
}}//定義並查集類
class
unionfind
public
intfind
(int i)
public
void
union
(int i,
int j)
count--
;//連通分量減1
}public
intcount()
}public
intregionsbyslashes
(string[
] grid)
else
if(grid[i]
.charat
(j)==
' ')
else}}
//並查集連線
for(
int i =
0; i < grid.length; i++)}
return uf.
count();}}
leetcode 959 由斜槓劃分區域
目錄 一 題目內容 二 解題思路 三 在由 1 x 1 方格組成的 n x n 網格 grid 中,每個 1 x 1 方塊由 或空格構成。這些字元會將方塊劃分為一些共邊的區域。請注意,反斜槓字元是轉義的,因此 用 表示。返回區域的數目。示例 1 輸入 輸出 2 解釋 2x2 網格如下 示例 2 輸入...
LeetCode 959 由斜槓劃分區域
難度 中等。這個題,我不會,看別人的思路。參考 然後問題同 200.島嶼數量,遍歷0的區域。我的實現 class solution void change map int i,int j,int n public int regionsbyslashes vector grid else if gr...
leetCode 959 由斜槓劃分區域
這題的關鍵點就是如何將每個方格進行劃分,以及如何計算每個小方格的座標,然後根據每個方格的型別在方格內合併,然後再方格之間合併,最後返回連通分量的個數即可 class solution else if cur else if j 1 n if i 1 n return uf.getcount clas...