岛屿数量 深搜
题目链接:99. 岛屿数量
文字讲解:99. 岛屿数量 | 代码随想录
解题思路
本题已经说明,只有水平方向和竖直方向才能组成岛屿
本题思路,是遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = {0,1,1,0,0,-1,-1,0};
void dfs(const vector<vector<int>>& grid ,vector<vector<bool>>& 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<vector<int>> grid(n,vector<int>(m,0));vector<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 ; //目前岛屿为0for(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<bits/stdc++.h>
using namespace std;
int dir[4][2] = {0,1,1,0,0,-1,-1,0};
void bfs(const vector<vector<int>>& grid ,vector<vector<bool>>& visited , int x, int y)
{queue<pair<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<vector<int>> grid(n,vector<int>(m,0));vector<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 ; //目前岛屿为0for(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 <bits/stdc++.h>
int dir[4][2] = {0,1,1,0,0,-1,-1,0};
void bfs(const vector<vector<int>>& grid , vector<vector<bool>>& visited , int x , int y, int& area)
{queue<pair<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<vector<int>> grid(n,vector<int>(m,0));vector<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];}}for(int i =0 ; i<n ; 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;
}