题目:http://codeforces.com/problemset/problem/598/D
题意:
求连通,然后计算每个连通块可以挂多少个。
题意:
求连通,然后计算每个连通块可以挂多少个。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N=1111;
int n,m,k;
char c;
bool a[N][N],vis[N][N];
int cal[N][N];
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int x,int y,int t)
{
vis[x][y]=true;
cal[x][y]=t;
for(int k=0;k<4;k++){
int xx=x+d[k][0];
int yy=y+d[k][1];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&!vis[xx][yy]&&!a[xx][yy])dfs(xx,yy,t);
}
}
int main()
{
//freopen("f.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=m;j++){
scanf("%c",&c);
if(c=='.')a[i][j]=0;
else a[i][j]=1;
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)
// printf("%d",a[i][j]);
// printf("\n");
// }
memset(vis,0,sizeof(vis));
int t=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!vis[i][j]&&!a[i][j]){
dfs(i,j,t);
++t;
}
}
}
int sum[t+2];
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!a[i][j]){
for(int k=0;k<4;k++){
int xx=i+d[k][0];
int yy=j+d[k][1];
if(a[xx][yy])sum[cal[i][j]]++;
}
}
}
}
int x,y;
for(int i=0;i<k;i++){
scanf("%d%d",&x,&y);
printf("%d\n",sum[cal[x][y]]);
}
return 0;
}