• 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 }
  • 相关阅读:
    POJ 2029 (二维树状数组)题解
    HDU 4819 Mosaic (二维线段树&区间最值)题解
    HDU 1823 Luck and Love (二维线段树&区间最值)题解
    POJ1061 青蛙的约会(扩展欧几里得)题解
    POJ 2155 Matrix (二维树状数组)题解
    POJ 1751 Highways(最小生成树&Prim)题解
    HDU 6148 Valley Numer (数位DP)题解
    HDU3652 B-number(数位DP)题解
    HDU 4734 (数位DP)题解
    HDU 2089 不要62 (数位DP)题解
  • 原文地址:https://www.cnblogs.com/mzchuan/p/11234265.html
Copyright © 2020-2023  润新知