給出乙個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最多能容納多少物品容量和。刷了...