FZU 1063 三维扫描
2016-03-17 21:22
176 查看
水题。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\n",Block); } int main() { while(~scanf("%d%d%d",&L,&W,&H)) { read(); init(); work(); } return 0; }
相关文章推荐
- 电路与电子学-第一章直流电路分析方法小概括
- 毕业设计第三十天
- Bzoj1875: [SDOI2009]HH去散步:邻接矩阵的幂
- 为大家提供一个完整的Hibernate Annotation项目_源码下载
- 为什么会存在TIME_WAIT < 初讲>
- java工作错误集
- Spring AOP(三)——通过@AspectJ注解切面
- MPI和MIC
- FZU 1062 洗牌问题
- linux基础命令(6)
- FZU 1063 三维扫描
- C# kinect v2学习笔记(一) kinect V2配置安装
- 常用sql语句(基础)
- Python学习笔记day9
- Spinner的功能和用法
- hdu2126(01背包)
- 指针基础知识 ,破坏指针数组的讨论,
- 网络请求
- 点击UIWebView中的控件跳出当前的试图
- epoll使用简单分析