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

Обсуждение задачи 1212. Морской бой

I need your help.
Послано Alexander Bovkun 6 апр 2005 02:00
I have tried to submit my program and got Wrong Answer on test 23. Also I have already read a topic below, but still WA. Give me some tests or tell what is wrong with my program:

{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R+,S+,T-,V+,X+}
{$M 16384,0,655360}
Program SeaBattle;
Type Point=Record
             X,Y:Integer;
           End;
Var N,M:Integer;L:Byte;
    Points:Array[1..200] Of Point;PointsCount:Byte;
    K:Byte;
    PointersOnBeginning:Array[1..30001] Of Byte;
    I,J,P,R,S,W:Integer;
    Result:LongInt;

Procedure ReadData;
Var ShipX,ShipY,ShipLen:Integer;
    ShipDir:Char;

  Procedure AddPoint(X,Y:Integer);
  Var Index:Byte;
  Begin
    For Index:=1 To PointsCount Do If (Points[Index].X=X) And (Points[Index].Y=Y) Then Exit;

    Inc(PointsCount);
    Points[PointsCount].X:=X;
    Points[PointsCount].Y:=Y;
  End;

Begin
  ReadLn(M,N,L);
  For I:=1 To L Do Begin
    Read(ShipX,ShipY,ShipLen);
    For J:=1 To 2 Do Read(ShipDir);
    ReadLn;

    If ShipDir='H' Then Begin
      For J:=1 To ShipLen Do AddPoint(ShipX+J-1,ShipY);

      If ShipY>=2 Then
        For J:=1 To ShipLen Do AddPoint(ShipX+J-1,ShipY-1);
      If ShipY<M Then
        For J:=1 To ShipLen Do AddPoint(ShipX+J-1,ShipY+1);

      If ShipX>=2 Then Begin
        If ShipY>=2 Then AddPoint(ShipX-1,ShipY-1);
        AddPoint(ShipX-1,ShipY);
        If ShipY<M Then AddPoint(ShipX-1,ShipY+1);
      End;

      If ShipX+ShipLen<=N Then Begin
        If ShipY>=2 Then AddPoint(ShipX+ShipLen,ShipY-1);
        AddPoint(ShipX+ShipLen,ShipY);
        If ShipY<M Then AddPoint(ShipX+ShipLen,ShipY+1);
      End;
    End Else Begin
      For J:=1 To ShipLen Do AddPoint(ShipX,ShipY+J-1);

      If ShipX>=2 Then
        For J:=1 To ShipLen Do AddPoint(ShipX-1,ShipY+J-1);
      If ShipX<N Then
        For J:=1 To ShipLen Do AddPoint(ShipX+1,ShipY+J-1);

      If ShipY>=2 Then Begin
        If ShipX>=2 Then AddPoint(ShipX-1,ShipY-1);
        AddPoint(ShipX,ShipY-1);
        If ShipX<N Then AddPoint(ShipX+1,ShipY-1);
      End;

      If ShipY+ShipLen<=M Then Begin
        If ShipX>=2 Then AddPoint(ShipX-1,ShipY+ShipLen);
        AddPoint(ShipX,ShipY+ShipLen);
        If ShipX<N Then AddPoint(ShipX+1,ShipY+ShipLen);
      End;
    End;
  End;
  ReadLn(K);
End;

Procedure Solve;

  Procedure SwapPoints(Var A,B:Point);
  Var TmpPoint:Point;
  Begin
    TmpPoint:=A;
    A:=B;
    B:=TmpPoint;
  End;

  Function GetCount(A:Integer):Integer;
  Begin
    If A>=K Then GetCount:=A-K+1 Else GetCount:=0;
  End;

Begin
  For I:=1 To M Do PointersOnBeginning[I]:=0;
  For I:=1 To PointsCount-1 Do
    For J:=I+1 To PointsCount Do If Points[I].Y>Points[J].Y Then SwapPoints(Points[I],Points[J]);

  J:=1;If PointsCount>=1 Then PointersOnBeginning[Points[J].Y]:=J;
  For I:=2 To PointsCount Do If Points[I].Y<>Points[J].Y Then Begin
    For P:=J To I-2 Do
      For R:=P+1 To I-1 Do If Points[P].X>Points[R].X Then SwapPoints(Points[P],Points[R]);

    J:=I;
    PointersOnBeginning[Points[J].Y]:=J;
  End;

  If J<>PointsCount Then
    For P:=J To PointsCount-1 Do
      For R:=P+1 To PointsCount Do If Points[P].X>Points[R].X Then SwapPoints(Points[P],Points[R]);

  For J:=1 To M Do Begin
    W:=1;
    If PointersOnBeginning[J]<>0 Then Begin
      For I:=PointersOnBeginning[J] To PointsCount Do If Points[I].Y=J Then Begin
        Result:=Result+GetCount(Points[I].X-W);
        W:=Points[I].X+1;

        If Points[I].Y>J Then Break;
      End;
    End;
    Result:=Result+GetCount(N-W+1);
  End;

  If K=1 Then Exit;

  For I:=1 To N Do PointersOnBeginning[I]:=0;
  For I:=1 To PointsCount-1 Do
    For J:=I+1 To PointsCount Do If Points[I].X>Points[J].X Then SwapPoints(Points[I],Points[J]);

  J:=1;If PointsCount>=1 Then PointersOnBeginning[Points[J].X]:=J;
  For I:=2 To PointsCount Do If Points[I].X<>Points[J].X Then Begin
    For P:=J To I-2 Do
      For R:=P+1 To I-1 Do If Points[P].Y>Points[R].Y Then SwapPoints(Points[P],Points[R]);

    J:=I;
    PointersOnBeginning[Points[J].X]:=J;
  End;

  If J<>PointsCount Then
    For P:=J To PointsCount-1 Do
      For R:=P+1 To PointsCount Do If Points[P].Y>Points[R].Y Then SwapPoints(Points[P],Points[R]);

  For J:=1 To N Do Begin
    W:=1;
    If PointersOnBeginning[J]<>0 Then Begin
      For I:=PointersOnBeginning[J] To PointsCount Do If Points[I].X=J Then Begin
        Result:=Result+GetCount(Points[I].Y-W);
        W:=Points[I].Y+1;

        If Points[I].X>J Then Break;
      End;
    End;
    Result:=Result+GetCount(M-W+1);
  End;
End;

Procedure WriteData;
Begin
  WriteLn(Result);
End;

Begin
  ReadData;
  Solve;
  WriteData;
End.