BFS to find connected blocks. Recursion will explode the stack.
#include <cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<map>#include<queue>#include<stack>#include<vector>using namespacestd;intm,n,l,t;inta[ -][1300][133];BOOLf[ -][1300][133];intdir[Ten][5]={ {0,0,1}, {0,0,-1}, {0,1,0}, {0,-1,0}, {1,0,0}, {-1,0,0}};structpoint{intA,b,c; Point (intAaintBbintcc) {a=AA; B=BB; C=cc; }};intFind (intAintBintc) { intres=0; Queue<Point>Q; Point P (a,b,c); Q.push (P); F[A][B][C]=1; while(!Q.empty ()) {Res++; Point Head=Q.front (); Q.pop (); for(intI=0;i<6; i++) { intna=head.a+dir[i][0]; intnb=head.b+dir[i][1]; intnc=head.c+dir[i][2]; if(na>l| | na<1)Continue; if(nb>m| | nb<1)Continue; if(nc>n| | nc<1)Continue; if(a[na][nb][nc]==0)Continue; if(f[na][nb][nc]==1)Continue; Point P (NA,NB,NC); Q.push (P); F[NA][NB][NC]=1; } } returnRes;}intMain () {memset (A,0,sizeofA); Memset (F,0,sizeoff); scanf ("%d%d%d%d",&m,&n,&l,&T); for(intk=1; k<=l;k++) for(intI=1; i<=m;i++) for(intj=1; j<=n;j++) scanf ("%d",&A[k][i][j]); intsum=0; for(intk=1; k<=l;k++) for(intI=1; i<=m;i++) for(intj=1; j<=n;j++) { if(a[k][i][j]==0)Continue; if(f[k][i][j]==1)Continue; intres=Find (K,I,J); if(res>=t) sum=sum+Res; } printf ("%d\n", sum); return 0;}
PAT (Advanced level) 1091. Acute Stroke (+)