这题求一个M*N*L大小的长方体中的连续空间的总和,大小不小于L才算是一个连续空间。读完题目,就形成条件反射需要用BFS来解决。这题的BFS比较经典,不用多说,直接贴上代码~
#include<stdio.h>
#include<queue>
using namespace std;
bool mark[1286][128][60];
int maze[1286][128][60]; struct Pos
{
int x,y,z;
};
queue<Pos> Q;
int go[][3] = {
1,0,0,
-1,0,0,
0,1,0,
0,-1,0,
0,0,1,
0,0,-1
};
int BFS(int a,int b,int c)
{
int volume=1;
while(Q.empty()==false)
{
Pos now = Q.front();
Q.pop();
for(int i=0;i<6;i++)
{
int nx = now.x+go[i][0];
int ny = now.y+go[i][1];
int nz = now.z+go[i][2];
if(nx<0||nx>=a||ny<0||ny>=b||nz<0||nz>=c)
{
continue;
}
if(maze[nx][ny][nz]==0 || mark[nx][ny][nz]==true)
{
continue;
}
Pos tmp;
tmp.x = nx;
tmp.y = ny;
tmp.z = nz;
Q.push(tmp);
mark[nx][ny][nz] = true;
volume++;
}
}
return volume;
}
int main()
{
int M,N,L,T,ans=0;
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++)
{
scanf("%d",&maze[j][k][i]);
}
}
}
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
for(int k=0;k<L;k++)
{
mark[i][j][k] = false;
}
}
}
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
for(int k=0;k<L;k++)
{
if(mark[i][j][k]==true||maze[i][j][k]==0)
{
continue;
}
else
{
mark[i][j][k] = true;
while(Q.empty()==false)
{
Q.pop();
}
Pos pos;
pos.x = i;
pos.y = j;
pos.z = k;
Q.push(pos);
int currentVolume = BFS(M,N,L);
if(currentVolume>=T)
{
ans+=currentVolume;
}
}
}
}
}
printf("%d\n",ans);
return 0;
}