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;
}