解题思路:一开始用dfs,但有一个超内存了。然后改用bfs,但最后一个总是超时,可这道题也没法大优化。后来发现是我bfs的写法问题,每次都喜欢定义一个vis数组,但这次特别大,每次初始化vis,大概要花费200ms。效率太低了,后来发现这个vis没有必要,只要把路径切断就好了。瞬间速度很快。其实刷刷水题也总是有出乎意料的收获。
#include<cstdio>
#include<cstring>
#include<set>
#include<iterator>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int z,x,y;
node(){
}
node(int z,int x,int y):z(z),x(x),y(y){
}
};
int mp[60][1286][128];
int dz[6]={1,-1,0,0,0,0},dx[6]={0,0,1,-1,0,0},dy[6]={0,0,0,0,1,-1};
int m,n,l,num;
queue<node> q;
void bfs(int l2,int m2,int n2)
{
node tp;
int l1,m1,n1;
//h.z=l2,h.x=m2,h.y=n2;
q.push(node(l2,m2,n2));
//q.push(h);
mp[l2][m2][n2]=0;
while(!q.empty())
{
tp=q.front();
q.pop();
l1=tp.z,m1=tp.x,n1=tp.y;
num++;
for(int i=0;i<6;i++)
{
int z=l1+dz[i];
int x=m1+dx[i];
int y=n1+dy[i];
if(z>=0&&z<l&&x>=0&&x<m&&y>=0&&y<n)
{
if(mp[z][x][y])
{
mp[z][x][y]=0;
//h.z=z,h.x=x,h.y=y;
q.push(node(z,x,y));
//q.push(h);
}
}
}
}
}
int main()
{
int t;
//freopen("t.txt","r",stdin);
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",&mp[i][j][k]);
}
}
}
int ans=0;
for(int i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<n;k++)
{
if(mp[i][j][k])
{
num=0;
bfs(i,j,k);
if(num>=t)
ans+=num;
}
}
}
}
printf("%d\n",ans);
return 0;
}