99.岛屿数量 深搜
其实就是求连通块的数量,理解两个容器的作用。
grid表示该位置是否为岛屿,vis表示该位置是否被标记过(遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。)
#include<iostream>
#include<vector>
using namespace std;
int dir[4][2]={0,-1,0,1,-1,0,1,0};
void dfs(const vector<vector<int>> &grid,vector<vector<bool>> &vis,int x,int y){for(int i=0;i<4;i++){int next_x = x+dir[i][0];int next_y = y+dir[i][1];if(next_x<0||next_x>=grid.size()||next_y< 0||next_y>=grid[0].size()) continue; if(grid[next_x][next_y]==1&&!vis[next_x][next_y]){vis[next_x][next_y]=true;dfs(grid,vis,next_x,next_y);}}
}
int main(){int N,M;cin>>N>>M;vector<vector<int>> grid(N,vector<int>(M));for(int i=0;i<N;i++){for(int j=0;j<M;j++){cin>>grid[i][j];}}vector<vector<bool>> vis(N,vector<bool>(M,false)); //相邻是否为岛屿int result=0;for(int i=0;i<N;i++){for(int j=0;j<M;j++){if(!vis[i][j]&&grid[i][j]==1){result++;vis[i][j]=true;dfs(grid,vis,i,j);}}}cout << result << endl;
}
广搜
两个二维容器的作用同上。
超时的原因:根本原因是只要加入队列就代表走过,就需要标记,而不是从队列拿出来的时候再去标记走过。
所以我们将符合条件的值加入到队列的同时,我们应该将其进行标记,即对应的vis标记为true;
#include<iostream>
#include<vector>
#include <queue>
using namespace std;
int dir[4][2]={0,-1,0,1,-1,0,1,0};
void bfs(const vector<vector<int>> &grid,vector<vector<bool>> &vis,int x,int y){queue<pair<int,int>> que;que.push({x,y});vis[x][y]=true;while(!que.empty()){pair<int,int> cur=que.front();que.pop();for(int i=0;i<4;i++){int next_x = cur.first+dir[i][0];int next_y = cur.second+dir[i][1];if(next_x<0||next_x>=grid.size()||next_y< 0||next_y>=grid[0].size()) continue; if(grid[next_x][next_y]==1&&!vis[next_x][next_y]){vis[next_x][next_y]=true;que.push({next_x,next_y});}}}
}
int main(){int N,M;cin>>N>>M;vector<vector<int>> grid(N,vector<int>(M));for(int i=0;i<N;i++){for(int j=0;j<M;j++){cin>>grid[i][j];}}vector<vector<bool>> vis(N,vector<bool>(M,false)); //相邻是否为岛屿int result=0;for(int i=0;i<N;i++){for(int j=0;j<M;j++){if(!vis[i][j]&&grid[i][j]==1){result++;bfs(grid,vis,i,j);}}}cout << result << endl;
}
100.岛屿的最大面积
深搜广搜都可以,主要是记录下每个岛屿中小岛屿的个数,每个小岛屿面积都是1。
#include<iostream>
#include<vector>
using namespace std;
int dir[4][2]={0,-1,0,1,-1,0,1,0};
int count=0;
void dfs(const vector<vector<int>> &grid,vector<vector<bool>> &vis,int x,int y){for(int i=0;i<4;i++){int next_x = x+dir[i][0];int next_y = y+dir[i][1];if(next_x<0||next_x>=grid.size()||next_y< 0||next_y>=grid[0].size()) continue; if(grid[next_x][next_y]==1&&!vis[next_x][next_y]){vis[next_x][next_y]=true;count++;dfs(grid,vis,next_x,next_y);}}
}
int main(){int N,M;cin>>N>>M;vector<vector<int>> grid(N,vector<int>(M));for(int i=0;i<N;i++){for(int j=0;j<M;j++){cin>>grid[i][j];}}vector<vector<bool>> vis(N,vector<bool>(M,false)); //相邻是否为岛屿int result=0;for(int i=0;i<N;i++){for(int j=0;j<M;j++){if(!vis[i][j]&&grid[i][j]==1){count=1;vis[i][j]=true;dfs(grid,vis,i,j);result=max(result,count);}}}cout << result << endl;
}