给你一个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 22 54 3
Output
6410
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\n",ve[bj[x-1][y-1]]);
88 }
89
90 }
来源:https://www.cnblogs.com/mzchuan/p/11234265.html