zoukankan      html  css  js  c++  java
  • 牛客练习赛A 【BFS】

    <题目链接>

    题目大意:

    给出一张图,问你其中 ' # ' 加上那些不能够到达边界的 ' . ' 的点的个数,' # ' 会起阻挡作用。

    解题分析:

    本题很好做,无非就是将所有能够由边界上 ' . ' 连接到的' . '的数量减去即可。需要注意的是,由于本题只给出n*m(n*m<1e6)的范围,所以需要巧妙的将二维转化为一维,然后进行操作。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cctype>  //内含isdigit()函数
     4 #include <queue>
     5 #include <algorithm>
     6 using namespace std;
     7 #define rep(i,s,t) for(int i=s;i<=t;i++)
     8 #define dwn(i,s,t) for(int i=s;i>=t;i--)
     9 #define mp make_pair
    10 #define pb push_back
    11 #define fi first
    12 #define se second
    13 typedef pair<int,int>pii;
    14 
    15 /*template<typename T>       //读入优化
    16 inline T read(T&x){
    17     x=0;int f=0;char ch=getchar();
    18     while (ch<'0' || ch>'9') f|=(ch=='-'),ch=getchar();
    19     while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    20     return x=f?-x:x;
    21 }*/
    22 template<typename T>
    23 inline T read(T&x) {
    24     x = 0;int f = 1; char ch = getchar();
    25     while(ch<'0' || ch>'9') { if(ch == '-') f=-1; ch=getchar(); }
    26     while(ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
    27     return x*f;
    28 }
    29 template<typename T>       //输出优化
    30 inline void Print(T X){
    31     if(X<0)X=-X,putchar('-');
    32     if(X>9)Print(X/10);putchar(X%10+48);
    33 }
    34 /*inline int read(){
    35     int x=0,f=1;char c=getchar();
    36     for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    37     for(;isdigit(c);c=getchar())x=x*10+c-'0';
    38     return x*f;
    39 }*/
    40 const int N = 1e6+10;
    41 int n,m;
    42 inline int id(int x,int y){return (x-1)*m+y;}   //将二维数组下标转化为一维数组下标
    43 char M[N],s[N];
    44 int vis[N];
    45 queue<pii>Q;
    46 const int mx[]={1,0,-1,0};
    47 const int my[]={0,1,0,-1};
    48 int main(){
    49     //n=read(),m=read();
    50     read(n);read(m);
    51     rep(i,1,n){
    52         scanf("%s",s+1);
    53         rep(j,1,m)M[id(i,j)]=s[j];
    54     }
    55     rep(i,1,n) rep(j,1,m) if(i==1||i==n||j==1||j==m){
    56         if(M[id(i,j)]!='#')Q.push(mp(i,j)),vis[id(i,j)]=1;   //将边界上的所有点都加入队列,并且标记
    57     }
    58     int ans=n*m;
    59     while(Q.size()){
    60         ans--;     //所有能够与边界相连的'.'点都要减去
    61         int x=Q.front().fi,y=Q.front().se;Q.pop();
    62         rep(dir,0,3){
    63             int nx=x+mx[dir],ny=y+my[dir];
    64             if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&M[id(nx,ny)]=='.'&&!vis[id(nx,ny)]){
    65                 vis[id(nx,ny)]=1;
    66                 Q.push(mp(nx,ny));
    67             }
    68         }
    69     }
    70     Print(ans);puts("");
    71 }

    2018-11-17

  • 相关阅读:
    一点一点学写Makefile(3)-增加第三方库和头文件
    一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件
    一点一点学写Makefile-1
    linux下使用libxml2实现对xml文件的读取及查询
    struts2 谷歌浏览器保存date类型数据时报错
    复习
    day31
    day30
    作业29
    day29
  • 原文地址:https://www.cnblogs.com/00isok/p/9975436.html
Copyright © 2011-2022 走看看