雜湊 並查集結構 島問題

2022-08-10 08:18:12 字數 1162 閱讀 7017

乙個矩陣中只有0和1兩種值, 每個位置都可以和自己的上、 下、 左、 右四個位置相連

如果有一片1連在一起, 這個部分叫做乙個島, 求乙個矩陣中有多少個島?

舉例:0 0 1 0 1 0

1 1 1 0 1 0

1 0 0 1 0 0

0 0 0 0 0 0

這個矩陣中有三個島

解:當矩陣數量較少時,解法(使用遞迴)

兩個函式

1.遍歷函式:遍歷矩陣,遇到為1的點,就呼叫感染函式

2.感染函式:使用遞迴的方法,將連成一片的1變成2

public class islands }}

return count;

}//感染函式:通過遞迴呼叫,將傳入位置(i,j)處以及他的上下左右為1的值都改寫成2

public static void infect(int m, int row, int col, int i, int j)

}//感染函式:通過遞迴呼叫,將傳入位置(i,j)處以及他的上下左右為1的值都改寫成2

public static void infect1(int m, int row, int col, int i, int j)

public static void main(string args) ,,,

,,,, };

system.out.println(countislands(m1));

int m2 = ,,,

,,,, };

system.out.println(countislands(m2));}}

使用並查集時(多工,平行計算)

將乙個大矩陣化成多個小矩陣,然後不同的cpu處理不同的矩陣,最後將不同的矩陣合併,

邊界問題,將邊界上連成一片的1合併

在小矩陣中,第乙個1作為代表結點,後面1連成一片的1都掛在代表結點下

然後在解決邊界時,若兩個1碰到一起了,就檢查兩個1的代表結點是不是一樣的,

不一樣的話,就合併兩個集合,同時島的個數-1

一樣的話,證明之前已經合併過了,島的個數不變

並查集的應用(島問題)

題意描述 乙個矩陣中只有0和1兩種值,每個位置都可以和自己的上 下 左 右四個位置相連,如果有一片1連在一起,這個部分叫做乙個島,求乙個矩陣中有多少個島?舉例 1,1,0,1 1,0,1,0 0,1,1,1 共有三個島。解決方案 常規解法 我們可以設計乙個感染函式,該函式的功能是如果當前位置是1,那...

排序(並查集 雜湊函式)

問題描述 給出乙個包含正整數的陣列p p1,pn 並假設陣列p經過排序後變成陣列q q1,qn 定義合法替換集合,如果整數對 x,y 屬於合法交換集合,則表示你可以交換陣列p中位置x和位置y的元素。現在有q個操作 詢問 詢問分為以下四種型別 1.交換位置a和位置b的元素 2.將整數對 a,b 加入到...

並查集問題

輸入 第一行 城鎮數目n,道路數目m 接下的每一行表示 某條道路連線的城鎮號 輸出 至少還需要建設的道路數目,才能將所有的城鎮連線起來 例子 輸入 3 31 2 1 22 1 輸出 1解釋 要使城鎮123連通,還需要修建23之間的連通路 即還需要修建一條路 cpp實現問題求解 include usi...