本文最后更新于586 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
1.本题作为我第一道做深搜的题,看到了许多以前做题没见过的思路,例如创建一个dir方向数组用于在遍历的时候查看当前节点上下左右的是否符合要求,还有就是以前也见过的visit数组将访问过的陆地置为true,这里借用代码随想录的思路:本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。
在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
这个思路一听就知道怎么做,只不过第一次接触这个题是真的不知道如何操作,所幸借着代码随想录的完整代码,厘清思路自己默写了一遍,我想这样的题尤其是dfs的题还是在多刷几次之后就有自己的思路了,希望以后这些题都可以自己迅速反应出思路然后按照自己的思路快速的写出代码。
CPP
#include<bits/stdc++.h>
using namespace std;
void dfs(vector<vector<bool>>& visit, const vector<vector<int>>& grid, int x, int y){
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
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(!visit[nextx][nexty] && grid[nextx][nexty] == 1){
visit[nextx][nexty] = true;
dfs(visit, grid, 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>> visit(n, vector<bool>(m, false));
int res = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(!visit[i][j] && grid[i][j] == 1){
visit[i][j] = true;
res++;
dfs(visit, grid, i, j);
}
}
}
cout << res << endl;
}