题意:
输入四个正整数M,N,K,T(K<=60,M<=1286,N<=128),代表每片的高度和宽度,片数和最小联通块大小。输出一共有多少个单元满足所在联通块大小大于等于T。
trick:
三元数组大小开小了。。。最后两个测试点答案错误,我是笨比。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int m,n,l,t; 5 int a[67][1300][130]; 6 int vis[67][1300][130]; 7 int ans[67][1300][130]; 8 int xx[7]={0,1,0,0,-1,0,0}; 9 int yy[7]={0,0,1,0,0,-1,0}; 10 int zz[7]={0,0,0,1,0,0,-1}; 11 typedef struct nod{ 12 int x,y,z; 13 }; 14 queue<nod>q; 15 void dfs(int x,int y,int z){ 16 while(!q.empty()){ 17 ++ans[x][y][z]; 18 nod now=q.front(); 19 q.pop(); 20 for(int i=1;i<=6;++i){ 21 int tx=now.x+xx[i]; 22 int ty=now.y+yy[i]; 23 int tz=now.z+zz[i]; 24 if(!vis[tx][ty][tz]&&a[tx][ty][tz]==1){ 25 nod node; 26 node.x=tx; 27 node.y=ty; 28 node.z=tz; 29 vis[tx][ty][tz]=1; 30 q.push(node); 31 } 32 } 33 } 34 } 35 void clear(queue<nod>&q){ 36 queue<nod>emp; 37 swap(q,emp); 38 } 39 int main(){ 40 ios::sync_with_stdio(false); 41 cin.tie(NULL); 42 cout.tie(NULL); 43 cin>>m>>n>>l>>t; 44 for(int i=1;i<=l;++i) 45 for(int j=1;j<=m;++j) 46 for(int k=1;k<=n;++k) 47 cin>>a[i][j][k]; 48 int sum=0; 49 for(int i=1;i<=l;++i) 50 for(int j=1;j<=m;++j) 51 for(int k=1;k<=n;++k) 52 if(a[i][j][k]==1&&!vis[i][j][k]){ 53 clear(q); 54 nod tamp; 55 tamp.x=i; 56 tamp.y=j; 57 tamp.z=k; 58 q.push(tamp); 59 vis[i][j][k]=1; 60 dfs(i,j,k); 61 if(ans[i][j][k]>=t) 62 sum+=ans[i][j][k]; 63 } 64 cout<<sum; 65 return 0; 66 }