注意对应好xyz
需要返回值:DFS使用max在每次的DFS中更新,BFS直接计数即可
如果图很大不要用DFS,会爆栈
#include<bits/stdc++.h>
using namespace std;
struct node{
int z,y,x;
}Node;
int G[70][1300][130];
bool inq[70][1300][130];
int ans;
int m,n,L,T;
int Z[6]={1,-1,0,0,0,0};
int Y[6]={0,0,1,-1,0,0};
int X[6]={0,0,0,0,1,-1};
bool judge(int z,int y,int x)
{
if(z<0||z>=L||y<0||y>=m||x<0||x>=n)return false;
if(G[z][y][x]==0||inq[z][y][x]==true)return false;
return true;
}
int BFS(int z,int y,int x)
{
int temp=0;
queue<node>q;
Node.x=x,Node.y=y,Node.z=z;
q.push(Node);
inq[z][y][x]=true;
while(!q.empty())
{
node front=q.front();
temp++;
q.pop();
for(int i=0;i<6;i++)
{
int newx=front.x+X[i],newy=front.y+Y[i],newz=front.z+Z[i];
if(judge(newz,newy,newx))
{
Node.x=newx,Node.y=newy,Node.z=newz;
q.push(Node);
inq[newz][newy][newx]=true;
}
}
}
return temp>=T?temp:0;
}
int main()
{
scanf("%d%d%d%d",&m,&n,&L,&T);
for(int z=0;z<L;z++)
{
for(int y=0;y<m;y++)
{
for(int x=0;x<n;x++)
{
int temp;
scanf("%d",&temp);
G[z][y][x]=temp;
}
}
}
for(int z=0;z<L;z++)
{
for(int y=0;y<m;y++)
{
for(int x=0;x<n;x++)
{
if(G[z][y][x]==1&&!inq[z][y][x])
{
ans+=BFS(z,y,x);
}
}
}
}
printf("%d",ans);
return 0;
}