传送门
题意
给一个三维的图,求连通的点个数
思路
暴力搜索即可,同时要注意如果用dfs可能因为递归层数太多而爆了内存栈。
代码
#include <bits/stdc++.h>
using namespace std;
int a[64][1300][140];
int vis[64][1300][140];
int nx[6][3]={{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};
struct node{
int x,y,z;
int num;
};
int m,n,l;
int bfs(int x,int y,int z){
int res=0;
queue <node> q;
q.push((node){x,y,z,0});
while(!q.empty()){
node t=q.front();q.pop();
//res=max(res,t.num);
// cout<<"t: "<<t.x<<" "<<t.y<<" "<<t.z<<endl;
for(int k=0;k<6;k++){
int tx=t.x+nx[k][0];
int ty=t.y+nx[k][1];
int tz=t.z+nx[k][2];
if(tx<1 || tx>n || ty<0 || ty>m || tz<0 || tz>l || a[tz][ty][tx]==0
|| vis[tz][ty][tx]){
continue;
}
// cout<<"push: "<<tx<<" "<<ty<<" "<<tz<<endl;
vis[tz][ty][tx]=1;
res++;
q.push((node){tx,ty,tz});
}
}
return res;
}
int main(){
int t;
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 cnt=0;
for(int i=1;i<=l;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
if(!vis[i][j][k] && a[i][j][k]){
vis[i][j][k]=1;
int res=bfs(k,j,i)+1;
// cout<<res<<endl;
if(res>=t) cnt+=res;
// return 0;
}
}
}
}
cout<<cnt;
return 0;
}