码迷,mamicode.com
首页 > 移动开发 > 详细

洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)

时间:2017-04-01 15:17:04      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:nbsp   while   --   ble   ring   class   highlight   ret   tps   

https://www.luogu.org/problem/show?pid=1141

题意:n*n地图,0可以走到相邻的某个1上,1可以走到相邻的某个0上,m次询问,问(x,y)能走到多少个格子?
n<=1e3,m<=1e5.若点a能到b,则b也能到a.显然a,b能到达的点相同,同一个联通块内的ans是相同的,即求点所在的连通块大小

#include <bits/stdc++.h>
using namespace std;
const int N=2e3+20;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int vis[N][N];
int n,mx,ans[N*N],cnt;//ans[i]第i块答案,连通块编号 
string s[N];
int dfs(int x,int y,int cur)
{
	vis[x][y]=cnt;
	mx++;
	int p=1-cur;
	for(int i=0;i<4;i++)
	{
		int a=x+dx[i];
		int b=y+dy[i];
		if(a>=0&&a<n&&b>=0&&b<n&&s[a][b]-‘0‘==p&&!vis[a][b])
			dfs(a,b,s[a][b]-‘0‘);
	}
} 
int main()
{
	int m;
	while(cin>>n>>m)
	{
		cnt=0;
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++)
			cin>>s[i];
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(!vis[i][j])
				{
					mx=0;
					cnt++;
					dfs(i,j,s[i][j]-‘0‘);
					ans[cnt]=mx;
				}
			}
		}
		while(m--)
		{
			int x,y;
			cin>>x>>y;
			x--,y--;
			cout<<ans[vis[x][y]]<<endl;
		}
	}
	return 0;
}

  

 

洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)

标签:nbsp   while   --   ble   ring   class   highlight   ret   tps   

原文地址:http://www.cnblogs.com/HIKARI1149/p/6655881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!