101. 孤岛的总面积 (kamacoder.com)
dfs遍历网格,较为容易
1、条件准备
二维数组存4个方向遍历,visit数组存是否走过,graph数组存图,n是行数,m是列数
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; i++)
using namespace std;
#define endl '\n'
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int visit[100][100];
int graph[100][100];
int n,m;
先输入存图,然后先遍历一边岛屿边缘,把非孤岛都走了,然后再遍历,走的就是孤岛了,只需要dfs返回面积即可,累加最后输出。
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
rep(i,0,n-1)
rep(j,0,m-1)
cin>>graph[i][j];
int answer=0;
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==1&&graph[i][j]&&!visit[i][j])
dfs(i,j);
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==2&&graph[i][j]&&!visit[i][j])
answer+=dfs(i,j);
cout<<answer;
return 0;
}
2、check函数
判断graph[x][y]的位置,0为越界,1为网格边缘,其余返回2
int check(int x,int y)
{
if(x<0||x>=n||y<0||y>=m)return 0;
else if(x==0||y==0||x==n-1||y==m-1)return 1;
return 2;
}
3、dfs函数
先标记走过,该岛屿初始面积为1,然后遍历四周,把相连的岛屿面积加进来,最后返回num即可
int dfs(int x,int y)
{
visit[x][y]=1;
int num=1;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0],yy=y+dir[i][1];
if(!check(xx,yy))continue;
if(!visit[xx][yy]&&graph[xx][yy])
{
num+=dfs(xx,yy);
}
}
return num;
}
4、总结
完整代码如下:
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; i++)
using namespace std;
#define endl '\n'
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int visit[100][100];
int graph[100][100];
int n,m;
int check(int x,int y)
{
if(x<0||x>=n||y<0||y>=m)return 0;
else if(x==0||y==0||x==n-1||y==m-1)return 1;
return 2;
}
int dfs(int x,int y)
{
visit[x][y]=1;
int num=1;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0],yy=y+dir[i][1];
if(!check(xx,yy))continue;
if(!visit[xx][yy]&&graph[xx][yy])
{
num+=dfs(xx,yy);
}
}
return num;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
rep(i,0,n-1)
rep(j,0,m-1)
cin>>graph[i][j];
int answer=0;
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==1&&graph[i][j]&&!visit[i][j])
dfs(i,j);
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==2&&graph[i][j]&&!visit[i][j])
answer+=dfs(i,j);
cout<<answer;
return 0;
}
102. 沉没孤岛 (kamacoder.com)
这个题只需要在上述代码上修改主函数即可
再第二次遍历孤岛时只需让岛屿变为水就行。
然后循环输出即可
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
rep(i,0,n-1)
rep(j,0,m-1)
cin>>graph[i][j];
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==1&&graph[i][j]&&!visit[i][j])
dfs(i,j);
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==2&&graph[i][j]&&!visit[i][j])
graph[i][j]=0;
rep(i,0,n-1)
{
rep(j,0,m-1)
{
cout<<graph[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
完整代码如下:
#include <bits/stdc++.h>
// #include<iostream>
// #include<iomanip>
// #include<vector>
// #include<queue>
// #include<cstring>
// #include <algorithm>
// #define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
using namespace std;
#define pii pair<int, int>
#define endl '\n'
const int M = 1e6 + 7;
const int N = 1e3 + 7;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int visit[100][100];
int graph[100][100];
int n,m;
int check(int x,int y)
{
if(x<0||x>=n||y<0||y>=m)return 0;
else if(x==0||y==0||x==n-1||y==m-1)return 1;
return 2;
}
void dfs(int x,int y)
{
visit[x][y]=1;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0],yy=y+dir[i][1];
if(!check(xx,yy))continue;
if(!visit[xx][yy]&&graph[xx][yy])
{
dfs(xx,yy);
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
rep(i,0,n-1)
rep(j,0,m-1)
cin>>graph[i][j];
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==1&&graph[i][j]&&!visit[i][j])
dfs(i,j);
rep(i,0,n-1)
rep(j,0,m-1)
if(check(i,j)==2&&graph[i][j]&&!visit[i][j])
graph[i][j]=0;
rep(i,0,n-1)
{
rep(j,0,m-1)
{
cout<<graph[i][j]<<' ';
}
cout<<endl;
}
return 0;
}