99. 岛屿数量(深度搜索dfs)[卡码网]
文档讲解:代码随想录.岛屿数量(深度搜索dfs)
视频讲解:无
状态:已完成
代码实现
#include <iostream>
#include <vector>
using namespace std;
int dir[4][2] = {0,1,1,0,-1,0,0,-1};//四个方向,对于单个网格
void dfs(const vector<vector<int>>& grid,vector<vector<bool>> & visited,int x,int y){
for(int i = 0; i < 4;i++){
int nextx = x+ dir[i][0];
int nexty = y + dir[i][1];
if(nextx < 0|| nextx>= grid.size()|| nexty<0|| nexty>=grid[0].size())continue;
if(!visited[nextx][nexty]&& grid[nextx][nexty]==1){
visited[nextx][nexty]= true;
dfs(grid,visited,nextx,nexty);
}
}
}
int main(){
int n,m;
cin>>n>>m;
//手动创建二维数组
vector<vector<int>> grid(n,vector<int>(m,0));
for(int i = 0; i < n;i++){
for(int j = 0; j < m ;j++){
cin>>grid[i][j];
}
}
vector<vector<bool>> visited(n,vector<bool>(m,false));
int result = 0;
for(int i = 0; i < n;i++){
for(int j = 0; j < m ;j++){
//未访问的陆地进行判断
if(!visited[i][j]&&grid[i][j]==1){
visited[i][j]=true;
result++;//遇到没访问过的陆地加1
dfs(grid,visited,i,j);//将与其相连的陆地都标记上ture
}
}
}
cout<<result<<endl;
}
心得体会
- dfs理解上还是有些问题,在结束条件上是如何理解的,
- 未访问的陆地进行判断,这里可以保证每次便利认为是陆地的部分,不会被再次访问
99. 岛屿数量(广度搜索bfs)[卡码网]
文档讲解:代码随想录.岛屿数量(广度搜索bfs)
视频讲解:无
状态:已完成
代码实现
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {0,1,1,0,-1,0,0,-1};//四个方向
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];
if(nextx < 0|| nextx>= grid.size()|| nexty<0|| nexty>=grid[0].size())continue;
if(!visited[nextx][nexty]&& grid[nextx][nexty]==1){
que.push({nextx,nexty});
visited[nextx][nexty] = true;
}
}
}
}
int main(){
int n,m;
cin>>n>>m;
//手动创建二维数组
vector<vector<int>> grid(n,vector<int>(m,0));
for(int i = 0; i < n;i++){
for(int j = 0; j < m ;j++){
cin>>grid[i][j];
}
}
vector<vector<bool>> visited(n,vector<bool>(m,false));
int result = 0;
for(int i = 0; i < n;i++){
for(int j = 0; j < m ;j++){
if(!visited[i][j]&&grid[i][j]==1){
visited[i][j]=true;
result++;//遇到没访问过的陆地加1
bfs(grid,visited,i,j);//将与其相连的陆地都标记上ture
}
}
}
cout<<result<<endl;
}
心得体会
- bfs深度搜索可能存在访问超时的问题,为了减少重复访问,需要在合适的地方定义已经访问的目标
100. 岛屿的最大面积(广度搜索bfs)[卡码网]
文档讲解:代码随想录.岛屿的最大面积(广度搜索bfs))
视频讲解:无
状态:已完成
// 版本一
#include <iostream>
#include <vector>
using namespace std;
int count;
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 越界了,直接跳过
if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的
visited[nextx][nexty] = true;
count++;
dfs(grid, visited, nextx, nexty);
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<vector<bool>> visited(n, vector<bool>(m, false));
int result = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (!visited[i][j] && grid[i][j] == 1) {
count = 1; // 因为dfs处理下一个节点,所以这里遇到陆地了就先计数,dfs处理接下来的相邻陆地
visited[i][j] = true;
dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true
result = max(result, count);
}
}
}
cout << result << endl;
}
心得体会
- 在之前的基础上,理解如果比较最大的岛屿即可