牛客练习赛A 【BFS】

<题目链接>

题目大意:

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

解题分析:

本题很好做,无非就是将所有能够由边界上 ' . ' 连接到的' . '的数量减去即可,但是本题我学习了一下OI小朋友的代码风格。

 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 inline int read(){
15     int x=0,f=1;char c=getchar();
16     for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
17     for(;isdigit(c);c=getchar())x=x*10+c-'0';
18     return x*f;
19 }
20 const int N = 1e6+10;
21 int n,m;
22 inline int id(int x,int y){return (x-1)*m+y;}   //将二维数组下标转化为一维数组下标
23 char M[N],s[N];
24 int vis[N];
25 queue<pii>Q;
26 const int mx[]={1,0,-1,0};
27 const int my[]={0,1,0,-1};
28 int main(){
29     n=read(),m=read();
30     rep(i,1,n){
31         scanf("%s",s+1);
32         rep(j,1,m)M[id(i,j)]=s[j];
33     }
34     rep(i,1,n) rep(j,1,m) if(i==1||i==n||j==1||j==m){
35         if(M[id(i,j)]!='#')Q.push(mp(i,j)),vis[id(i,j)]=1;   //将边界上的所有点都加入队列,并且标记
36     }
37     int ans=n*m;
38     while(Q.size()){
39         ans--;     //所有能够与边界相连的'.'点都要减去
40         int x=Q.front().fi,y=Q.front().se;Q.pop();
41         rep(dir,0,3){
42             int nx=x+mx[dir],ny=y+my[dir];
43             if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&M[id(nx,ny)]=='.'&&!vis[id(nx,ny)]){
44                 vis[id(nx,ny)]=1;
45                 Q.push(mp(nx,ny));
46             }
47         }
48     }
49     printf("%d\n",ans);
50 }

2018-11-17

猜你喜欢

转载自www.cnblogs.com/00isok/p/9975436.html
今日推荐