牛客练习赛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

转载于:https://www.cnblogs.com/00isok/p/9975436.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值