讲真,看了半天的题目,不知道什么意思。然后问了大哥后,感觉自己的审题能力真的是不行。看题目要仔细认真哈~
题目的意思是这是一个三维的,l是z 找不小于t的连通块
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> using namespace std; struct node { int x,y,z; }; int fx[]={1,-1,0,0,0,0};//(平)右左上下(立)上下 int fy[]={0,0,-1,1,0,0}; int fz[]={0,0,0,0,1,-1}; int M[65][1300][135]; int vis[65][1300][135]; int m,n,l,t,ans=0; int bfs(int a,int b,int c) { node bg; bg.x=c,bg.y=b,bg.z=a; queue <node> q; q.push(bg); int num=1; vis[a][b][c]=1; while(!q.empty()) { node t=q.front(); q.pop(); for(int h=0;h<6;h++){ int xx=t.x+fx[h]; int yy=t.y+fy[h]; int zz=t.z+fz[h]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&zz>=0&&zz<l&&M[zz][yy][xx]==1&&!vis[zz][yy][xx]){ node temp; temp.x=xx,temp.y=yy,temp.z=zz; vis[zz][yy][xx]=1; q.push(temp); num++; } } } return num; } int main() { 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",&M[i][j][k]); for(int i=0;i<l;i++) for(int j=0;j<m;j++) for(int k=0;k<n;k++){ if(M[i][j][k]==1&&!vis[i][j][k]) { int gg=bfs(i,j,k); if(gg>=t) ans+=gg;} } printf("%d\n",ans); return 0; }