脑卒中,给定l个切片,切片大小为m×n。切片用0和1的矩阵表示。某一点所在切片的上下左右点和相邻两切片的相同位置点算作相连。计算相连的块的体积,超过阈值就加进总值,最后给出总值。
找到未访问的值为1的点,加进队列,标记访问,该块的体积数++。如果访问过或者值不为1就跳过。然后当队列不为空时把该点的相邻点都进行判断(加进队列)。最后返回的时候判断该块体积是否超过阈值,超过则加进总值,最后输出。
dfs最后两个点过不了,段错误,应该是爆栈了。没办法只能写队列。最后也是在超时边缘试探(刚好卡着600ms)
#include <bits/stdc++.h>
using namespace std;
int m,n,l,t;
struct Node{
bool vis=false,val=false;
};
int sum=0;
Node mat[65][1300][130];
queue<vector<int> > q;
void judge(int idx1,int idx2,int idx3,int &currsum){
if(idx1>=l || idx1<0 ||idx2<0 ||idx2>=m ||idx3<0 ||idx3>=n)return;
if(!mat[idx1][idx2][idx3].vis && mat[idx1][idx2][idx3].val){
vector<int> temp;
temp.push_back(idx1);
temp.push_back(idx2);
temp.push_back(idx3);
q.push(temp);
mat[idx1][idx2][idx3].vis=true;
currsum++;
}
}
void bfs(int idx1,int idx2,int idx3,int &currsum){//idx1:l 2:m 3:n
judge(idx1,idx2,idx3,currsum);
while(!q.empty()){
vector<int> t=q.front();
q.pop();
judge(t[0]-1,t[1],t[2],currsum);
judge(t[0]+1,t[1],t[2],currsum);
judge(t[0],t[1]-1,t[2],currsum);
judge(t[0],t[1]+1,t[2],currsum);
judge(t[0],t[1],t[2]-1,currsum);
judge(t[0],t[1],t[2]+1,currsum);
}
}
int main(){
scanf("%d%d%d%d",&m,&n,&l,&t);
for(int i=0;i<l;i++){
for(int j=0;j<m;j++){
for(int k=0;k<n;k++){
int val;
scanf("%d",&val);
if(val==1)mat[i][j][k].val=true;
}
}
}
for(int i=0;i<l;i++){
for(int j=0;j<m;j++){
for(int k=0;k<n;k++){
if(!mat[i][j][k].vis && mat[i][j][k].val){
int num=0;
bfs(i,j,k,num);
if(num>=t)sum+=num;
}
}
}
}
printf("%d",sum);
}