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

Обсуждение задачи 1215. Точность попадания снаряда

Help me to fix my program.
Послано Alexander Bovkun 8 апр 2005 00:13
My program gives WA on test 11. Help me to fix some bugs thanks a lot.

{$N+}
Program ExactnessOfProjectileHit;
Const Epsilon=0.00000000000001;
Type Real=Extended;
Type Point=Record
             X,Y:Real;
           End;
Var Circle:Point;
    Polygon:Array[1..100] Of Point;VerticesCount:Byte;
    I,J:Byte;
    Result:Real;

Procedure ReadData;
Begin
  ReadLn(Circle.X,Circle.Y,VerticesCount);
  For I:=1 To VerticesCount Do ReadLn(Polygon[I].X,Polygon[I].Y);
End;

Procedure Solve;

  Function Min(A,B:Real):Real;
  Begin
    If A<B Then Min:=A Else Min:=B;
  End;

  Function PointIsInPolygon:Boolean;
  Var Index:Byte;
      TrueSquare,Square:Real;
  Begin
    TrueSquare:=0;
    For Index:=2 To VerticesCount-1 Do
      TrueSquare:=TrueSquare+(Polygon[Index].X-Polygon[1].X)*(Polygon[Index+1].Y-Polygon[1].Y)-
      (Polygon[Index+1].X-Polygon[1].X)*(Polygon[Index].Y-Polygon[1].Y);
    TrueSquare:=Abs(TrueSquare)/2;

    Square:=0;
    For Index:=1 To VerticesCount-1 Do
      Square:=Square+Abs((Polygon[Index].X-Circle.X)*(Polygon[Index+1].Y-Circle.Y)-
      (Polygon[Index+1].X-Circle.X)*(Polygon[Index].Y-Circle.Y));
    Square:=Square+Abs((Polygon[VerticesCount].X-Circle.X)*(Polygon[1].Y-Circle.Y)-
      (Polygon[1].X-Circle.X)*(Polygon[VerticesCount].Y-Circle.Y));
    Square:=Abs(Square)/2;

    PointIsInPolygon:=Abs(Square-TrueSquare)<Epsilon;
  End;

  Function Distance(P1,P2:Point):Real;
  Begin
    Distance:=Sqrt(Sqr(P1.X-P2.X)+Sqr(P1.Y-P2.Y));
  End;

  Function GetShortestDistance(P1,P2,P3:Point):Real;
  Var TmpReal,TmpReal2:Real;
      TmpPoint:Point;
  Begin
    TmpReal:=(P1.X-P2.X);TmpReal2:=(P2.Y-P1.Y);
    If TmpReal2<>0 Then Begin
      TmpPoint.Y:=((P2.X-P3.X)*TmpReal*TmpReal2)+(P3.Y*Sqr(TmpReal2))+(P2.Y*Sqr(TmpReal));
      TmpPoint.Y:=TmpPoint.Y/(Sqr(TmpReal)+Sqr(TmpReal2));
      TmpPoint.X:=(((P2.Y-TmpPoint.Y)*TmpReal)/TmpReal2)+P2.X;
    End Else Begin
      TmpPoint.X:=P3.X;
      TmpPoint.Y:=P1.Y;
    End;

    If P1.Y<=P2.Y Then Begin
      If (TmpPoint.Y>=P1.Y) And (TmpPoint.Y<=P2.Y) Then Begin
        GetShortestDistance:=Distance(P3,TmpPoint);
      End Else Begin
        GetShortestDistance:=Min(Distance(P1,P3),Distance(P2,P3));
      End;
    End Else Begin
      If (TmpPoint.Y>=P2.Y) And (TmpPoint.Y<=P1.Y) Then Begin
        GetShortestDistance:=Distance(P3,TmpPoint);
      End Else Begin
        GetShortestDistance:=Min(Distance(P1,P3),Distance(P2,P3));
      End;
    End;
  End;

Begin
  If PointIsInPolygon=False Then Begin
    Result:=GetShortestDistance(Polygon[1],Polygon[VerticesCount],Circle);
    For I:=1 To VerticesCount-1 Do Result:=Min(Result,GetShortestDistance(Polygon[I],Polygon[I+1],Circle));

    Result:=Result*2;
  End Else Result:=0;
End;

Procedure WriteData;
Begin
  WriteLn(Result:0:3);
End;

Begin
  ReadData;
  Solve;
  WriteData;
End.