洛谷P2372 —yyy2015c01挑战算周长题解

传送门

题目大意:

给你一个矩阵和一个点的坐标,让你求出这个点所在的连通块的周长。

那么周长怎么求呢?

你不要告诉我连这你都不会

就是将这个连通块的每一个点上靠边的长度加起来即为周长。

主要思路: dfs 搜索

将每一个点的周长都算出来,在搜索连通块时将搜到的点的周长都加起来,输出即可。

坑点:

  1. 在边上的点也有周长

  2. 搜周长时搜上下左右(4)个方向

  3. 连通块(8)面连通

  4. 走过的点不能重复走

最后贴上代码:

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

蟹蟹观看!

完结撒花(。・∀・)ノ❀❀❀

我要拿金牌!
原文地址:https://www.cnblogs.com/jerrywang-blogs/p/13523989.html