乙個矩陣中只有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...