Igor In the Museum CodeForces - 598D bfs

题目大意:一位土豪爱看名画,在每块区域的每份名画他都会仔细去看,会给屡次查询坐标,求在此坐标内他最多能够看到多少名画node

 

每次查询都搜一次会t 因此咱们换一种思路,对于一个查询,如没找过(visit==0)就搜一次,搜的时候染色(allcnt)结果存入(num数组里),第二次到这个坐标的时候就直接去num找。num要开够大,最多染色量应该为 图面积的一半,可是还开完整面积。ios

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;

char gap[1080][1080];
int visit[1080][1080];
bool visit1[1080][1080];
int n,m,k;
int dir[4][2]={-1,0,0,-1,1,0,0,1};
int num[1100000];


/*int judge(int x,int y)
{
	int cnt=0;
	if(gap[x][y-1]=='*'&&!visit[x][y-1]) visit[x][y-1]=1,cnt++;
	if(gap[x][y+1]=='*'&&!visit[x][y+1]) visit[x][y+1]=1,cnt++;
	if(gap[x+1][y]=='*'&&!visit[x+1][y]) visit[x+1][y]=1,cnt++;
	if(gap[x-1][y]=='*'&&!visit[x-1][y]) visit[x-1][y]=1,cnt++;
	return cnt;
}*/
int judge(int x,int y)
{
	int cnt=0;
	if(y-1>=1&&gap[x][y-1]=='*') cnt++;
	if(y+1<=m&&gap[x][y+1]=='*') cnt++;
	if(x+1<=n&&gap[x+1][y]=='*') cnt++;
	if(x-1>=1&&gap[x-1][y]=='*') cnt++;
	return cnt;
}
struct node
{
	int x,y; 
};

int bfs(int x,int y,int allcnt)
{
	//cout<<"in"<<endl;
	//memset(visit1,0,sizeof(visit1));
	int ans=0;
	node st;
	visit[x][y]=allcnt;
	st.x=x,st.y=y;
	queue<node> q;
	q.push(st);
	node in,ne;
	while(!q.empty())
	{
		in=q.front();
		ans+=judge(in.x,in.y);
		q.pop();
		for(int i=0;i<4;i++)
		{
			ne.x=in.x+dir[i][0];
			ne.y=in.y+dir[i][1];
			if(gap[ne.x][ne.y]=='.'&&visit[ne.x][ne.y]==0&&ne.x>=1&&ne.x<=n&&ne.y>=1&&ne.y<=m)
			{
				visit[ne.x][ne.y]=allcnt;
				q.push(ne);
			}
		}
	}
	return ans;
}

int main()
{
	int allcnt=1;
	memset(visit,0,sizeof(visit)); 
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++) scanf("%s",gap[i]+1);
	for(int i=1;i<=k;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		if(visit[x][y]==0)
		{	
			int ans=bfs(x,y,allcnt);
			num[allcnt]=ans;
			printf("%d\n",ans);
			allcnt++;
		}
		else
		{
			printf("%d\n",num[visit[x][y]]);
		}
	}	
}