牛客练习赛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
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。