题目链接:99. 岛屿数量
文字讲解:99. 岛屿数量 | 代码随想录
本题已经说明,只有水平方向和竖直方向才能组成岛屿
本题思路,是遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。
- #include
- using namespace std;
- int dir[4][2] = {0,1,1,0,0,-1,-1,0};
- void dfs(const vector
int >>& grid ,vectorbool >>& visited , int x, int y) - {
- if(visited[x][y] || grid[x][y] == 0)
- {
- return; //访问过了,或者遇到海水后就返回
- }
- visited[x][y] = true;
- for(int i =0 ; i<4; i++)
- {
- int nextx = x + dir[i][0];
- int nexty = y + dir[i][1];
- int n = grid.size();
- int m = grid[0].size();
- if(nextx<0 || nextx >=n || nexty < 0 || nexty >= m)
- continue; //如果越界了,就直接下一个
- dfs(grid,visited,nextx,nexty);
- }
- }
-
- int main()
- {
- int result,n,m;
- cin>>n >> m;
- vector
int>> grid(n,vector<int>(m,0)); - vector
bool>> visited(n,vector<bool>(m,false)); - for(int i =0 ; i< n ; i++)
- {
- for(int j =0 ; j< m ; j++)
- {
- cin >> grid[i][j];
- }
- }
- result = 0 ; //目前岛屿为0
- for(int i =0 ; i< n ; i++)
- {
- for(int j =0 ; j< m ; j++)
- {
- if(!visited[i][j] && grid[i][j]==1)
- {
- //没有访问过,并且是陆地的话
- result++;
- dfs(grid,visited,i,j);
- }
-
- }
- }
- cout<< result << endl;
- }
题目链接:99. 岛屿数量
文字讲解:99. 岛屿数量 | 代码随想录
本题的思路是一样的
但是切记,入队就是标记为访问过了,否则会重复入队,如下图
- #include
- using namespace std;
- int dir[4][2] = {0,1,1,0,0,-1,-1,0};
- void bfs(const vector
int >>& grid ,vectorbool >>& visited , int x, int y) - {
- queue
int,int>> que; - que.push({x,y});
- visited[x][y] = true; //入队就代表访问过了
- while(!que.empty())
- {
- pair<int,int> cur = que.front();
- que.pop();
- int curx = cur.first;
- int cury = cur.second;
- for(int i =0 ;i<4 ; i++)
- {
- int nextx = curx + dir[i][0];
- int nexty = cury + dir[i][1];
- int n = grid.size();
- int m = grid[0].size();
- if(nextx<0 || nextx >= n || nexty<0 || nexty >= m)
- continue; //越界就继续
- if(!visited[nextx][nexty] && grid[nextx][nexty] == 1)
- {
- que.push({nextx,nexty});
- visited[nextx][nexty] = true;
- }
- }
- }
- }
-
- int main()
- {
- int result,n,m;
- cin>>n >> m;
- vector
int>> grid(n,vector<int>(m,0)); - vector
bool>> visited(n,vector<bool>(m,false)); - for(int i =0 ; i< n ; i++)
- {
- for(int j =0 ; j< m ; j++)
- {
- cin >> grid[i][j];
- }
- }
- result = 0 ; //目前岛屿为0
- for(int i =0 ; i< n ; i++)
- {
- for(int j =0 ; j< m ; j++)
- {
- if(!visited[i][j] && grid[i][j]==1)
- {
- //没有访问过,并且是陆地的话
- result++;
- bfs(grid,visited,i,j);
- }
-
- }
- }
- cout<< result << endl;
- }
题目链接:100. 岛屿的最大面积
文字讲解:100. 岛屿的最大面积 | 代码随想录
与上两题一样的思路,这里使用广搜
- using namespace std;
- #include
- int dir[4][2] = {0,1,1,0,0,-1,-1,0};
- void bfs(const vector
int >>& grid , vectorbool >>& visited , int x , int y, int& area) - {
- queue
int,int>> que; - que.push({x,y});
- visited[x][y] = true;
- area +=1; //第一个点也是面积
- while(!que.empty())
- {
- pair<int,int> cur = que.front();
- que.pop();
- int curx = cur.first;
- int cury = cur.second;
- for(int i=0 ; i<4; i++)
- {
- int nextx = curx + dir[i][0];
- int nexty = cury + dir[i][1];
- int n = grid.size();
- int m = grid[0].size();
- if(nextx<0 || nextx>= n || nexty < 0 || nexty >=m)
- continue;
- if(!visited[nextx][nexty] && grid[nextx][nexty]==1)
- {
- que.push({nextx,nexty});
- visited[nextx][nexty] = true;
- area+=1;
- }
- }
- }
- }
-
- int main()
- {
- int result = 0;
- int n,m;
- cin>>n>>m;
- vector
int>> grid(n,vector<int>(m,0)); - vector
bool>> visited(n,vector<bool>(m,false)); - for(int i =0 ; i
- {
- for(int j =0 ;j < m; j++)
- {
- cin>>grid[i][j];
- }
- }
- for(int i =0 ; i
- {
- for(int j =0 ;j < m; j++)
- {
- if(!visited[i][j] && grid[i][j]==1)
- {
- int area = 0;
- bfs(grid,visited,i,j,area);
- result = max(result,area);
- }
- }
- }
- cout << result << endl;
- }
-
相关阅读:
凝聚五城力量 2022Home尧泰汉海“益起微笑”公益活动圆满举行
方舟开服务器游戏基础管理设置
Spring框架中用于注入构造函数参数的标签constructor-arg
葡萄糖-聚乙二醇-巯基Glucose-PEG-Alkyne|葡萄糖-聚乙二醇-生物素Glucose-PEG-Biotin
【组件库】element-plus组件库
后端秋招面经
1283_Mike Zamansky讲解的emacs配置文件初步
机房小探索
23种设计模式之职责链模式(Chain of Responsibility Pattern)
保险业SAP转型:奠定坚实的基础
-
原文地址:https://blog.csdn.net/m0_73815931/article/details/139829885