E

给你一个n*m的方格图表示一个博物馆的分布图.
每个方格上用'*'表示墙,用'.'表示空位.
每一个空格和相邻的墙之间都有一幅画.
(相邻指的是上下左右相邻).
你可以从一个空格的位置走到相邻的空格位置.
现在你给你若干个(xi,yi)形式的询问,表示你现在在(xi,yi)这个位置(保证为空位)出发,问你从这个点出发你能看到多少幅画.

Input

第一行有3个整数n,m,k(3<=n,m<=1000,1<=k<=min(m*m,100000) ).
接下来有n行每行m个字符,每个字符为'.'或者'*'.
紧接着k行,每行两个整数xi,yi.
Output

对于k个询问,输出相应的答案.

Examples

Input
5 6 3
******
*..*.*
******
*....*
******
2 2
2 5
4 3
Output
6
4
10
Input
4 4 1
****
*..*
*.**
****
3 2
Output
8

思路:这个题dfs,bfs都可以写,我用的是bfs.博物馆中每个相连的空地可以是一部分,用一个计数器给这些部分做标记,并用vectory存放第几部分可以看到几副画,bfs搜索这些部分可以看到几幅画。bfs时只需要在搜索时遇到墙了就ans加一。注意题目给出的数很大,
注意超时。

 1 #include <cstdio>
 2 #include <fstream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <deque>
 6 #include <vector>
 7 #include <queue>
 8 #include <string>
 9 #include <cstring>
10 #include <map>
11 #include <stack>
12 #include <set>
13 #include <sstream>
14 #include <iostream>
15 #define mod 1000000007
16 #define ll long long
17 using namespace std;
18 
19 int n,m,k;
20 string bwg[1005];
21 int bj[1005][1005];
22 vector<int> ve;
23 int fx[4]={1,-1,0,0},fy[4]={0,0,1,-1};
24 typedef  pair<int,int> pa;
25 pa no,s;
26 void bfs(int t)
27 {
28     queue<pa> qu;
29     qu.push(no);
30     int ans=0;
31     while(!qu.empty())
32     {
33         no=qu.front();
34         qu.pop();
35         for(int i=0;i<4;i++)
36         {
37             int x=no.first+fx[i];
38             int y=no.second+fy[i];
39             if(x>=0&&x<n&&y>=0&&y<m&&bj[x][y]==0)
40             {
41                 if(bwg[x][y]=='*')
42                 {
43                     ans++;
44                 }
45                 if(bwg[x][y]=='.')
46                 {
47                     s.first=x;
48                     s.second=y;
49                     bwg[x][y]='*';
50                     qu.push(s);
51                     bj[x][y]=t;
52                 }
53             }
54         }
55     }
56     ve.push_back(ans);
57 }
58 int main()
59 {
60     scanf("%d %d %d",&n,&m,&k);
61     for(int i=0;i<n;i++)
62     {
63         cin>>bwg[i];
64     }
65     memset(bj,0,sizeof(bj));
66     int id=1;
67     ve.push_back(0);
68     for(int i=0;i<n;i++)
69     {
70         for(int j=0;j<m;j++)
71         {
72             if(bwg[i][j]=='.')
73             {
74                 no.first=i;
75                 no.second=j;
76                 bwg[i][j]='*';
77                 bj[i][j]=id;
78                 bfs(id);
79                 id++;
80             }
81         }
82     }
83     int x,y;
84     for(int i=0;i<k;i++)
85     {
86         scanf("%d %d",&x,&y);
87         printf("%d
",ve[bj[x-1][y-1]]);
88     }
89 
90 }