题目描述
话说郭靖和黄蓉在美丽的桃花岛无忧无虑地生活着,花团锦簇,与岛上居民和睦相处,其乐融融!
风云突变,蒙古大军入侵中原,"国家兴亡,匹夫有责",何况是抱有强烈正义感和爱国精神的郭靖夫妇。他们决定择日动身,前往边关,保家卫国。
情真真,意切切,桃花岛的人们和郭靖夫妇是多么难舍难分!因此,他们决定来举行一次晚会,为郭靖夫妇饯行。
郭靖说:"如果你能来参加我们的晚会,并能圆满地完成整个活动,我将会送给你一件精美的礼物!"。不是郭靖的降龙十八掌的套路和黄蓉的打狗棒法吧?太好了,要是我能得到,嘿嘿,我一定能成为……
消息传出,参与者众!有真诚送别的岛上居民,但其中也不乏破坏晚会的敌特分子!
第一幕
为了安全起见,郭靖夫妇租借了一台三维扫描仪器。利用它可以对三维物体(例如大脑)进行扫描,每个参加晚会的人都得经过扫描仪进行识别,其目的就是想通过该扫描仪来分析哪些人带了危险物品(比如炸药和危险兵器)。
扫描仪将扫描的结果用一个三维的数组来保存,数组的每一个元素表示空间的一个象素。数组的元素是0-255的整数,表示该象素的灰度。例如0表示该象素是黑色的,255表示该象素是白色的。
被扫描的物体往往是由若干个部件组合而成的。在实际问题中,同一个部件内部的色彩变化相对连续,而不同的部件的交界处色彩往往有突变。同一个部件内部,相邻两个象素的灰度差不超过正整数M(说明:每一个象素与前后、左右、上下的6个象素相邻)。M决定了程序识别部件的灵敏度。
任务
你必须提供一个scan.exe的可执行程序,对于给定的物体,运行该程序,即刻就可以判断该物体是由几个部件组成的。
输入输出格式
输入格式:
在输入的文本文件scan.in中的第一行是三个正整数L,W,H(L,W,H<=50),表示物体的长、宽、高。第二行是一个整数M(0<=M<=255),表示识别部件的灵敏度。
接下来是L×W×H个0-255的非负整数,按照空间坐标从小到大的顺序依次给出每个象素的灰度。
说明:对于空间两点P1(x1,y1,z1)和P2(x2,y2,z2),P1 (x1 (x1=x2且y1 (x1=x2且y1=y2且z1
输出格式:
在输出的文本文件scan.out中只有一个整数N,表示一共识别出几个部件。
输入输出样例
输入样例#1:
2 2 2
0
1 1 1 1 2 2 2 2
输出样例#1:
2
提示信息
分析:这题显然是求连通块个数,
只是在精度问题上要做一点小小的改动,dfs和bfs都可以,只是要把维度做成三维的(模板题)
直接上代码
#include<bits/stdc++.h>
using namespace std;
int L,W,H,M;
int ma[257][257][257],the[257][257][257],ans=0;
int dx[7]={0,-1,1,0,0,0,0};
int dy[7]={0,0,0,-1,1,0,0};
int dz[7]={0,0,0,0,0,-1,1};
void dfs(int x,int y,int z)
{
for(int i=1;i<=6;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
int zz=z+dz[i];
if(xx<1||yy<1||zz<1||xx>L||yy>W||zz>H) continue;
if((abs(ma[xx][yy][zz]-ma[x][y][z])>M)||the[xx][yy][zz]==1)continue;
the[xx][yy][zz]=1;
dfs(xx,yy,zz);
}
}
int main()
{
cin>>L>>W>>H>>M;
for(int i=1;i<=L;i++)
{
for(int j=1;j<=W;j++)
{
for(int k=1;k<=H;k++)
{
cin>>ma[i][j][k];
}
}
}
for(int i=1;i<=L;i++)
{
for(int j=1;j<=W;j++)
{
for(int k=1;k<=H;k++)
{
if(the[i][j][k]==0)
{
the[i][j][k]=1;
dfs(i,j,k);
ans++;
}
}
}
}
cout<<ans;
return 0;
}