水题。DFS求连通块。
#include<cstdio> #include<cstring> #include<cmath> #include <iomanip> #include<iostream> #include<algorithm> using namespace std; const int maxn=50+10; int f[maxn][maxn][maxn]; int flag[maxn][maxn][maxn]; int L,W,H; int M; int Block; int dir[6][3]={ {0,0,1}, {0,0,-1}, {0,1,0}, {0,-1,0}, {1,0,0}, {-1,0,0} }; void read() { scanf("%d",&M); for(int i=1;i<=L;i++) for(int j=1;j<=W;j++) for(int k=1;k<=H;k++) scanf("%d",&f[i][j][k]); } void init() { memset(flag,0,sizeof flag); Block=0; } bool P(int a,int b,int c) { if(a>=1&&a<=L) { if(b>=1&&b<=W) { if(c>=1&&c<=H) { return 1; } } } return 0; } void dfs(int x,int y,int z) { flag[x][y][z]=Block; for(int i=0;i<6;i++) { int new_x=x+dir[i][0]; int new_y=y+dir[i][1]; int new_z=z+dir[i][2]; int R=f[x][y][z]; int F=f[new_x][new_y][new_z]; if(P(new_x,new_y,new_z)&&flag[new_x][new_y][new_z]==0&&abs(R-F)<=M) dfs(new_x,new_y,new_z); } } void work() { for(int i=1;i<=L;i++) for(int j=1;j<=W;j++) for(int k=1;k<=H;k++) { if(flag[i][j][k]==0) { Block++; dfs(i,j,k); } } printf("%d ",Block); } int main() { while(~scanf("%d%d%d",&L,&W,&H)) { read(); init(); work(); } return 0; }