tyvj1980 胖子机械师

描述 Description
    胖子说:“我的图纸是三维的(先进吧),用坐标系分了网格,每个工件包含相邻的一些网格部分,由于万恶的瘦子很愚蠢,我不得不认为模糊程度相差在一定范围的相邻两格是同一工件,你就帮我看看总共有多少个工件吧”。
输入格式 Input Format
第一行3个整数l,w,h (l,w,h<=50) 表示三维图纸的长宽高; 第二行1个整数m(0<=m<=255)表示模糊程度的最大允许差值; 后面有一行l*w*h个0~255的非负整数,按照空间坐标从小到大给出瘦子画每一格的模糊程度(坐标大小比较,按长,宽,高的优先顺序)。
输出格式 Output Format
一个整数,工件个数。
样例输入 Sample Input [复制数据]2 2 2 0 1 1 1 1 2 2 2 2样例输出 Sample Output [复制数据]2
题解: 裸地DFS就搞定了 三维相邻的就是六个方向 每次把能合并的加个标记 对每个点做一次 没标记的就是新的一个 然后总数加1 就OK了
program zhongqiup4; var a:array[0..51,0..51,0..51 ] of integer; dx:array[1..6] of integer=(0,0,0,0,1,-1); dy:array[1..6] of integer=(0,0,-1,1,0,0); dz:array[1..6] of integer=(1,-1,0,0,0,0); mark:array[0..51,0..51,0..51] of boolean; l,h,w,i,j,k,max,sum:integer; procedure dfs(l,h,w:integer); var i:integer; begin mark[l,h,w]:=true; for i:=1 to 6 do begin if (not(mark[l+dx[i],h+dy[i],w+dz[i]])) and(abs(a[l,h,w]-a[l+dx[i],h+dy[i],w+dz[i]])<=max) then begin mark[l+dx[i],h+dy[i],w+dz[i]]:=true; dfs(l+dx[i],h+dy[i],w+dz[i]); end; end; end; begin readln(l,w,h); readln(max); fillchar(mark,sizeof(mark),true); for i:=1 to l do for j:=1 to w do for k:=1 to h do begin read(a[i,j,k]); mark[i,j,k]:=false; end; sum:=0; for i:=1 to l do for j:=1 to w do for k:=1 to h do if not mark[i,j,k] then begin inc(sum); dfs(i,j,k); end; writeln(sum); end.

posted on 2012-10-06 03:12  馒头~blue  阅读(230)  评论(0编辑  收藏  举报

导航