洛谷P2372 —yyy2015c01挑戰算周長題解

傳送門

題目大意:

給你一個矩陣和一個點的座標,讓你求出這個點所在的連通塊的周長。ios

那麼周長怎麼求呢?數組

你不要告訴我連這你都不會測試

就是將這個連通塊的每個點上靠邊的長度加起來即爲周長。spa

主要思路: dfs 搜索

將每個點的周長都算出來,在搜索連通塊時將搜到的點的周長都加起來,輸出便可。code

坑點:

  1. 在邊上的點也有周長ci

  2. 搜周長時搜上下左右\(4\)個方向get

  3. 連通塊\(8\)面連通io

  4. 走過的點不能重複走class

最後貼上代碼:

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

蟹蟹觀看!

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

相關文章
相關標籤/搜索