Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите в оптимизации кода
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Witaliy
Всем привет!

У меня есть такой код:

program my;
var n,m,i,j : integer;
    k,q,res : longint;
    a,b: array[0..101,0..101] of byte;
begin
readln(n,m,k);
for i := 1 to n do
 begin
 for j := 1 to m do
  read(a[i,j]);
 readln;
end;
for q := 1 to k do
begin
for i := 1 to n do
  begin
  for j := 1 to m do
    begin
    if a[i,j] = 1 then
     begin
     b[i-1,j] := 1;
     b[i+1,j] := 1;
     b[i,j+1] := 1;
     b[i,j-1] := 1;
     end;
    end;
  end;
for i := 1 to n do
 for j := 1 to m do
  begin
  if a[i,j] = 1 then
   b[i,j] := 1;
  if b[i,j] = 1 then a[i,j] := 1;
 end;
end;
res := 0;
for i := 1 to n do
  for j := 1 to m do
    if a[i,j] = 1 then
     inc(res);
writeln(res);
end.


Но при прохождении тестов видаёт лимит времени.
1<N,M<=100
1<=K<=1000000

Спасибо!
TarasBer
Я так понимаю, надо найти кол-во точек, от которых можно дойти до одной из помеченых не более чем за k шагов? Вопрос - если k больше чем n+m<=101+101=202, то автоматически всё поле достижимо, зачем такие большие ограничения на него?
volvo
Witaliy, смотри, что ты делаешь: (твой же код, но нормально отформатированный)

readln(n,m,k);
for i := 1 to n do begin
  for j := 1 to m do read(a[i,j]);
  readln;
end;

for q := 1 to k do begin
  for i := 1 to n do begin
    for j := 1 to m do begin
      if a[i,j] = 1 then begin
        b[i-1,j] := 1;
        b[i+1,j] := 1;
        b[i,j+1] := 1;
        b[i,j-1] := 1;
      end;
    end;
  end;

  for i := 1 to n do
    for j := 1 to m do begin
      if a[i,j] = 1 then b[i,j] := 1;
      if b[i,j] = 1 then a[i,j] := 1;
    end;
end;

res := 0;
for i := 1 to n do
  for j := 1 to m do
    if a[i,j] = 1 then inc(res);
writeln(res);
, то есть цикл For Q = ... ты можешь смело выкинуть, от него ничего не зависит (Q вообще в программе нигде больше не используется)? Но мне почему-то кажется, что тебе надо не оптимизировать программу, а прежде всего добиться ее правильной работы, потому что сейчас что-то не так у тебя (что именно - сказать не могу, задания не вижу, а догадываться - неблагодарное это дело...)... А вот потом - когда исправишь, и программа заработает правильно - посмотрим, что можно сделать для ее ускорения...
TarasBer
Цитата(volvo @ 16.02.2009 22:25) *

Witaliy, смотри, что ты делаешь: (твой же код, но нормально отформатированный)
то есть цикл For Q = ... ты можешь смело выкинуть, от него ничего не зависит (Q вообще в программе нигде больше не используется)?


Что значит q не используется?
За один шаг цикла отмечаются все соседи помеченной области. За q шагов - все точки, до которых можно добраться за q шагов.
Гость
всё верно
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.