ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1254. Крепкий орешек

Why I always get CRASH? Please help me.
Послано BYF 25 авг 2003 18:34
This is my program.

Program Ural1254;
  Const
    Up:Array[1..8, 1..2] Of Integer=((1, 0), (0, 1), (-1, 0), (0, -1),
                                     (1, 1), (1, -1), (-1, 1), (-1, -
1));
  Type
    Rec=Record
          X, Y:Byte;
          Long:Real;
        End;
  Var
    P2, V:Real;
    M, N, K:Integer;
    Map:Array[1..75, 1..75] Of Char;
    Bomb:Array[0..1000, 1..2] Of Integer;
    Buf:Array[1..5625] Of Rec;
    Gone:Array[1..75, 1..75] Of Boolean;

  Procedure Init;
    Var
      A, B:Integer;
    Begin
      P2:=Sqrt(2);
      Readln(M, N, K, V);
      For A:=1 To N Do
        Begin
          For B:=1 To M Do Read(Map[A, B]);
          Readln;
        End;
      Readln(Bomb[0, 1], Bomb[0, 2]);
      For A:=1 To K Do Readln(Bomb[A, 1], Bomb[A, 2]);
    End;

  Procedure Main;
    Var
      Where, Step, NowFa:Integer;
      Done:Boolean;
      Total:Real;

    Procedure Search;
      Var
        A, NowX, NowY:Integer;

      Function OK(X, Y:Integer):Boolean;
        Begin
          If (X>0) And (Y>0) And (X<=M) And (Y<=N) And Not Gone[Y, X]
          And(Map[Y, X]='.') Then OK:=True
            Else OK:=False;
        End;

      Begin
        For A:=1 To 8 Do
          Begin
            NowX:=Buf[NowFa].X+Up[A, 1];
            NowY:=Buf[NowFa].Y+Up[A, 2];
            If OK(NowX, NowY) Then
              Begin
                Gone[NowY, NowX]:=True;
                Inc(Step);
                Buf[Step].X:=NowX;
                Buf[Step].Y:=NowY;
                If A>4 Then Buf[Step].Long:=Buf[NowFa].Long+P2
                  Else Buf[Step].Long:=Buf[NowFa].Long+1;
                If (NowX=Bomb[Where+1, 1]) And (NowY=Bomb[Where+1,
2]) Then
                  Begin
                    Done:=True;
                    Exit;
                  End;
              End;
          End;
      End;

    Begin
      Total:=0;
      For Where:=0 To K-1 Do
        Begin
          FillChar(Buf, SizeOf(Buf), 0);
          FillChar(Gone, SizeOf(Gone), False);
          NowFa:=1;
          Step:=1;
          Buf[NowFa].X:=Bomb[Where, 1];
          Buf[NowFa].Y:=Bomb[Where, 2];
          Gone[Bomb[Where, 2], Bomb[Where, 1]]:=True;
          Done:=False;
          Repeat
            Search;
            Inc(NowFa);
          Until Done;
          Total:=Total+Buf[Step].Long;
        End;
      Writeln(Total/V:0:2);
    End;

  Begin
    Init;
    Main;
  End.