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