题目大意:一位土豪爱看名画,在每块区域的每份名画他都会仔细去看,会给屡次查询坐标,求在此坐标内他最多能够看到多少名画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]]); } } }