牛客练习赛A 【BFS】

<题目链接>

题目大意:

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

解题分析:

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

#include <bits/stdc++.h>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef pair<int,int>pii;

template<typename T>
inline T read(T&x) {
    x = 0;int f = 1; char ch = getchar();
    while(ch<'0' || ch>'9') { if(ch == '-') f=-1; ch=getchar(); }
    while(ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
    return x*f;
}
template<typename T>       //输出优化
inline void Print(T X){
    if(X<0)X=-X,putchar('-');
    if(X>9)Print(X/10);putchar(X%10+48);
}
const int N = 1e6+10;
int n,m;
inline int id(int x,int y){return (x-1)*m+y;}   //将二维数组下标转化为一维数组下标
char M[N],s[N];
int vis[N];
queue<pii>Q;
const int mx[]={1,0,-1,0};
const int my[]={0,1,0,-1};
int main(){
    read(n);read(m);
    rep(i,1,n){
        scanf("%s",s+1);
        rep(j,1,m)M[id(i,j)]=s[j];
    }
    rep(i,1,n) rep(j,1,m) if(i==1||i==n||j==1||j==m){
        if(M[id(i,j)]!='#')Q.push(mp(i,j)),vis[id(i,j)]=1;   //将边界上的所有点都加入队列,并且标记
    }
    int ans=n*m;
    while(Q.size()){
        ans--;     //所有能够与边界相连的'.'点都要减去
        int x=Q.front().fi,y=Q.front().se;Q.pop();
        rep(dir,0,3){
            int nx=x+mx[dir],ny=y+my[dir];
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&M[id(nx,ny)]=='.'&&!vis[id(nx,ny)]){
                vis[id(nx,ny)]=1;
                Q.push(mp(nx,ny));
            }
        }
    }
    Print(ans);puts("");
}

 

 

2018-11-17

posted @ 2018-11-17 20:20  悠悠呦~  阅读(224)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end