传送门
题目大意:
给你一个矩阵和一个点的坐标,让你求出这个点所在的连通块的周长。
那么周长怎么求呢?
你不要告诉我连这你都不会
就是将这个连通块的每一个点上靠边的长度加起来即为周长。
主要思路: dfs 搜索
将每一个点的周长都算出来,在搜索连通块时将搜到的点的周长都加起来,输出即可。
坑点:
-
在边上的点也有周长
-
搜周长时搜上下左右(4)个方向
-
连通块(8)面连通
-
走过的点不能重复走
最后贴上代码:
#include<iostream>
using namespace std;
int n,m;
bool b[23][23]={0},flag[23][23]={0};//原数组和标记数组(标记是否走过)
int a[23][23]={0};//边长
const int x1[10]={-1,-1,-1,0,1,1,1,0},y1[10]={-1,0,1,1,1,0,-1,-1};//偏移量
int dfs(int x,int y)
{
flag[x][y]=1;//标记已走过
int ans=a[x][y];
for(int i=0;i<8;i++)
if(b[x+x1[i]][y+y1[i]]&&!flag[x+x1[i]][y+y1[i]])ans+=dfs(x+x1[i],y+y1[i]);//边界都是0,不用担心边界问题
return ans;
}
void ch()
{
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
if(b[i][j])
{
if(!b[i-1][j])a[i][j]++;
if(!b[i][j-1])a[i][j]++;
if(!b[i][j+1])a[i][j]++;
if(!b[i+1][j])a[i][j]++;
}//每个点的靠边长度
}
int main()
{
char c;
int x,y;
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
{
cin>>c;
if(c=='X')b[i][j]=1;//初始化原数组
}
ch();
// for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
// {
// cout<<a[i][j]<<" ";
// if(j==m)cout<<endl;
// }用于测试靠边长度
cout<<dfs(x,y);
return 0;
}