http://acm.pku.edu.cn/JudgeOnline/problem?id=1096
Код:
const ddx:array[0..5] of longint=(0,0,1,-1,0,0); ddy:array[0..5] of longint=(1,-1,0,0,0,0); ddz:array[0..5] of longint=(0,0,0,0,1,-1); type rec1=record x,y,z:integer; end; var sp:array[-1..61,-1..61,-1..61] of integer; lst:array[1..216000] of rec1; q:array[1..239328] of rec1; i,j,n,m,k,l,p,h,t,xx,yy,zz:longint; begin fillchar(sp,sizeof(sp),255); repeat readln(n,m,k,l); if (n=0) and (m=0) and (k=0) and (l=0) then break; fillchar(sp,sizeof(sp),0); for i:=1 to l do begin read(p); with lst[i] do begin x:=p mod n; p:=p div n; y:=p mod m; z:=p div m; sp[x,y,z]:=2; end; end; h:=1; t:=1; with q[1] do begin x:=-1; y:=-1; z:=-1; end; while (h<=t) do begin with q[h] do for i:=0 to 5 do begin xx:=x+ddx[i]; yy:=y+ddy[i]; zz:=z+ddz[i]; if xx>=-1 then if yy>=-1 then if zz>=-1 then if xx<=n then if yy<=m then if zz<=k then if sp[xx,yy,zz]=0 then begin sp[xx,yy,zz]:=1; inc(t); with q[t] do begin x:=xx; y:=yy; z:=zz; end; end; end; inc(h); end; j:=0; for xx:=0 to n do for yy:=0 to m do for zz:=0 to k do if sp[xx,yy,zz]=2 then for i:=0 to 5 do if sp[xx+ddx[i],yy+ddy[i],zz+ddz[i]]=1 then inc(j); writeln('The number of faces needing shielding is ',j,'.'); until false; end.