Решение
Тема: поиск в ширину
Сложность: средняя
Для решения можно использовать волновой алгоритм, который заключается в следующем. Начальная позиция помечается значением 0. На
`i`-ом шаге нужно найти пометку
`i-1` и пометить все непомеченные клетки значением
`i`.
var
n,x,y,x1,y1,i,k,m:integer;
u:array[1..100,1..100] of integer;
procedure xod(x2,y2:integer);
begin
if (x2<1) or (x2>n) or (y2<1) or (y2>n) then
exit;
if u[x2,y2]>=0 then exit;
u[x2,y2]:=i;
inc(m);
end;
begin
read(n,x,y,k);
m:=1;
for x1:=1 to n do
for y1:=1 to n do
u[x1,y1]:=-1;
u[x,y]:=0;
for i:=1 to k do
for x:=1 to n do
for y:=1 to n do
if u[x,y]=i-1 then
begin
xod(x+1,y+2);
xod(x-1,y+2);
xod(x+1,y-2);
xod(x-1,y-2);
xod(x+2,y+1);
xod(x-2,y+1);
xod(x+2,y-1);
xod(x-2,y-1);
end;
writeln(m);
end.
Время работы этого алгоритма равно
`O(N^2*K)`, что вполне укладывается в 1 секунду. Время можно уменьшить до
`O(N^2)`, если использовать поиск в ширину, и новые отмеченные клетки заносить в очередь
var
n,x,y,x1,y1,k1,k,q1,q2,m:integer;
q:array[1..10000] of record x,y:integer; end;
u:array[1..100,1..100] of integer;
procedure xod(x2,y2:integer);
begin
if (x2<1) or (x2>n) or (y2<1) or (y2>n) then
exit;
if u[x2,y2]>=0 then exit;
u[x2,y2]:=k1;
inc(m);
q[q2].x:=x2;
q[q2].y:=y2;
inc(q2);
end;
begin
read(n,x,y,k);
q[1].x:=x;
q[1].y:=y;
q1:=1;
q2:=2;
m:=1;
for x1:=1 to n do
for y1:=1 to n do
u[x1,y1]:=-1;
u[x,y]:=0;
while q1<q2 do
begin
x:=q[q1].x;
y:=q[q1].y;
inc(q1);
if u[x,y]<k then
begin
k1:=u[x,y]+1;
xod(x+1,y+2);
xod(x-1,y+2);
xod(x+1,y-2);
xod(x-1,y-2);
xod(x+2,y+1);
xod(x-2,y+1);
xod(x+2,y-1);
xod(x-2,y-1);
end;
end;
writeln(m);
end.