题意:
输入四个正整数M,N,K,T(K<=60,M<=1286,N<=128),代表每片的高度和宽度,片数和最小联通块大小。输出一共有多少个单元满足所在联通块大小大于等于T。
trick:
三元数组大小开小了。。。最后两个测试点答案错误,我是笨比。
代码:
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int m,n,l,t;
int a[67][1300][130];
int vis[67][1300][130];
int ans[67][1300][130];
int xx[7]={0,1,0,0,-1,0,0};
int yy[7]={0,0,1,0,0,-1,0};
int zz[7]={0,0,0,1,0,0,-1};
typedef struct nod{
int x,y,z;
};
queue<nod>q;
void dfs(int x,int y,int z){
while(!q.empty()){
++ans[x][y][z];
nod now=q.front();
q.pop();
for(int i=1;i<=6;++i){
int tx=now.x+xx[i];
int ty=now.y+yy[i];
int tz=now.z+zz[i];
if(!vis[tx][ty][tz]&&a[tx][ty][tz]==1){
nod node;
node.x=tx;
node.y=ty;
node.z=tz;
vis[tx][ty][tz]=1;
q.push(node);
}
}
}
}
void clear(queue<nod>&q){
queue<nod>emp;
swap(q,emp);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>m>>n>>l>>t;
for(int i=1;i<=l;++i){
for(int j=1;j<=m;++j){
for(int k=1;k<=n;++k){
cin>>a[i][j][k];
}
}
}
int sum=0;
for(int i=1;i<=l;++i){
for(int j=1;j<=m;++j){
for(int k=1;k<=n;++k){
if(a[i][j][k]==1&&!vis[i][j][k]){
clear(q);
nod tamp;
tamp.x=i;
tamp.y=j;
tamp.z=k;
q.push(tamp);
vis[i][j][k]=1;
dfs(i,j,k);
if(ans[i][j][k]>=t){
sum+=ans[i][j][k];
}
}
}
}
}
cout<<sum;
return 0;
}
【PAT甲级】1091 Acute Stroke (30 分)
原文:https://www.cnblogs.com/ldudxy/p/11907032.html