天梯赛就是喜欢搞些复杂的dfs和bfs
这题就是一道三维的bfs
#include<iostream>
#include<queue>
using namespace std;
struct Node
{
int a,b,c;
Node(int a1,int b1,int c1):a(a1),b(b1),c(c1){};
};
const int maxa=1286+5,maxb=128+5,maxc=60+5;
int G[maxa][maxb][maxc];
int vis[maxa][maxb][maxc];
int M,N,L,T;
int pa[6]={1,-1,0,0,0,0},pb[6]={0,0,1,-1,0,0},pc[6]={0,0,0,0,1,-1};
bool isedgeok(int a,int b,int c)
{
if(a<M&&a>=0&&b<N&&b>=0&&c<L&&c>=0) return true;
return false;
}
int bfs(int a,int b,int c)
{
if(!G[a][b][c]||vis[a][b][c]) return 0;
int cnt=1;
vis[a][b][c]=1;
queue<Node> qu;
qu.push(Node(a,b,c));//bug 1
while(!qu.empty())
{
auto tmp=qu.front();
qu.pop();
a=tmp.a,b=tmp.b,c=tmp.c;
for(int i=0;i<6;++i)
{
int tmpa=a+pa[i],tmpb=b+pb[i],tmpc=c+pc[i];
if(isedgeok(tmpa,tmpb,tmpc)&&!vis[tmpa][tmpb][tmpc]&&G[tmpa][tmpb][tmpc])//bug 0
{
cnt++;
qu.push(Node(tmpa,tmpb,tmpc));
vis[tmpa][tmpb][tmpc]=1;
}
}
}
if(cnt>=T) return cnt;
return 0;
}
int main()
{
cin>>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)
cin>>G[j][k][i];
int sum=0;
for(int i=0;i<L;++i)
for(int j=0;j<M;++j)
for(int k=0;k<N;++k)
sum+=bfs(j,k,i);
cout<<sum;
}