求助
  • 板块P1141 01迷宫
  • 楼主LHLeisus
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/7/20 09:58
  • 上次更新2023/11/4 14:06:09
查看原帖
求助
332123
LHLeisus楼主2021/7/20 09:58

思路:每搜到一个点就把和他相连的所有点标记成一样的,然后把个数存到D数组里,直接输出d数组里存的个数

#include<iostream>
#define o 1005
using namespace std;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int map[o][o],cnt=1;
char ch;
bool vis[o][o];
int paint[o][o],d[1000005];
int n,m,ans=0;
void solve(int i,int j)
{
	if(i<0||j<0||i>=n||j>=n||paint[i][j]) 
	return ;
	ans++;
	paint[i][j]=cnt;
	for(int w=0;w<4;w++)
	{
		int nx=i+dx[w],ny=j+dy[w];
		if(nx>=0&&nx<n&&ny>=0&&ny<n&&map[nx][ny]!=map[i][j]&&!paint[nx][ny])
		solve(nx,ny);
	}
	d[cnt]=ans;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		{
			cin>>ch;
			if(ch='1') map[i][j]=1;
			else map[i][j]=0;
		}
	for(int i=0;i<m;i++)
	{
		ans=0;
		int a,b;
		cin>>a>>b;
		if(!paint[a][b])
		{
			solve(a,b);
			cnt++;
		}
		cout<<d[paint[a][b]]<<endl;
	}
	return 0;
}
2021/7/20 09:58
加载中...