關於求01串組成的島嶼系列問題

2021-08-20 04:03:57 字數 2177 閱讀 5612

給出乙個n行m列的01串,例如:

0 1 1 0 1

0 1 0 0 1

1 1 0 1 0

0 0 1 1 0

則該地圖上有三個島嶼面積分別為5,2,3;

那麼我們應該應該如何去求這些島嶼的個數以及島嶼的面積呢?

我有這樣乙個想法,我們迴圈遍歷這個二維陣列,當遇到1時進行「登陸「,所謂「登陸「即用dfs或者bfs去把所有的1置為乙個標記值,然後接著迴圈遍歷二維陣列,最後對進行dfs或者bfs次數進行計數,這個次數就是島嶼的個數;在進行bfs時我用了順序隊,這樣在遍歷完成後順序隊裡的元素個數即1的個數也就是島嶼的面積;

在bfs或者dfs時,為了不走重複的路,在進隊或者進棧時把地圖map對應的位置標記為-1,即這個路已經走過;

下面是我的**:由於本人水平有限,**有錯誤的地方請指出;

#include

#include

#include

#define max_size 100 // 棧(佇列)的最大長度;

int bfs(int **map, int x, int y,int n, int m);

int dfs_1(int **map, int x, int y,int n, int m);

void dfs_2(int **map, int x, int y, int n, int m,int *temp);

typedef struct node_que queue; 

typedef struct node_stockstock; 

int main()

}for(i = 0; i < n ; i++)}}

for(i = 0; i < n; i++)

}printf("(bfs)最大島嶼的面積(即1的個數)是  = %d\n",max);

printf("(bfs)島嶼的總個數 =  %d\n",num_of_island);

max = 0;

num_of_island = 0;

for(i = 0; i < n ; i++)}}

for(i = 0; i < n; i++)

}printf("(非遞迴dfs)最大島嶼的面積(即1的個數)是  = %d\n",max);

printf("(非遞迴dfs)島嶼的總個數 =  %d\n",num_of_island);

max = 0;

num_of_island = 0;

for(i = 0; i < n ; i++)}}

for(i = 0; i < n; i++)

}printf("(遞迴dfs)最大島嶼的面積(即1的個數)是  = %d\n",max);

printf("(遞迴dfs)島嶼的總個數 =  %d\n",num_of_island);

for(i = 0; i < n;i++)

free(map[i]);

free(map);

return 0;

// bfs

int bfs(int **map, int x, int y,int n, int m)

if(temp.x < n- 1 && map[temp.x + 1][temp.y ] == 1)

if(temp.y > 0 && map[temp.x][temp.y - 1] == 1)

if(temp.x > 0 && map[temp.x - 1][temp.y] == 1)

}return front + 1;

}// 非遞迴dfs

int dfs_1(int **map, int x, int y,int n, int m)

}if(find == 1)

else

}return area_of_island;

}// 遞迴dfs

void dfs_2(int **map, int x, int y, int n, int m,int *temp)

if( x > 0 && map[x - 1][y] == 1)

if( y > 0 && map[x][y-1] == 1)

if( x < n - 1 && map[x + 1][y] == 1)

map[x][y] = 2;

執行結果:

關於01矩陣問題求島嶼個數及面積問題

給定形如下 的矩陣,15,5 0,1,0,1,0 1,1,0,0,0 0,0,1,1,0 0,1,0,1,0 1,0,0,0,0 0,1,0,1,0 1,1,0,0,0 0,0,1,1,0 0,1,0,1,0 1,0,0,0,0 0,1,0,1,0 1,1,0,0,0 0,0,1,1,0 0,1,0...

01串的排序問題 演算法

01 串的排序問題 code 首先按長度排序,長度一樣,按 1 的個數排序,1 的個數一樣時,就按ascii排序 include include include include include if there is not included fstream libary we will get t...

關於01揹包問題的動態規劃思路

大二在讀生自己的總結,求大牛不要噴。要做動態規劃題最重要的就是找思路,怎麼分解這個問題,把這個大問題化為小問題,小問題再化為更小的問題,最後就能做出來了。動態規劃裡有乙個經典的01揹包問題,乙個揹包的容量為k,然後有n個不同的物品大小分別為v1,v2,v3 求這個揹包k最多能容納多少物品容量和。刷了...