tyvj1980 胖子机械师
描述 Description
胖子说:“我的图纸是三维的(先进吧),用坐标系分了网格,每个工件包含相邻的一些网格部分,由于万恶的瘦子很愚蠢,我不得不认为模糊程度相差在一定范围的相邻两格是同一工件,你就帮我看看总共有多少个工件吧”。
输入格式 Input Format
第一行3个整数l,w,h (l,w,h<=50) 表示三维图纸的长宽高;
第二行1个整数m(0<=m<=255)表示模糊程度的最大允许差值;
后面有一行l*w*h个0~255的非负整数,按照空间坐标从小到大给出瘦子画每一格的模糊程度(坐标大小比较,按长,宽,高的优先顺序)。
输出格式 Output Format
一个整数,工件个数。
题解: 裸地DFS就搞定了 三维相邻的就是六个方向 每次把能合并的加个标记 对每个点做一次 没标记的就是新的一个 然后总数加1 就OK了
Delphi语言: 高亮代码由发芽网提供
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.