<题目链接>
题目大意:
给出一张图,问你其中 ' # ' 加上那些不能够到达边界的 ' . ' 的点的个数,' # ' 会起阻挡作用。
解题分析:
本题很好做,无非就是将所有能够由边界上 ' . ' 连接到的' . '的数量减去即可,但是本题我学习了一下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