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

Обсуждение задачи 1043. Закрыть дугу

(WA) What's wrong with my program?
Послано Grebnov Ilya[ISPU] 1 апр 2003 14:30
VAR
  X0, X1, X2 : Extended;
  Y0, Y1, Y2 : Extended;
  A, B, C : Extended;
  A0, B0, C0 : Extended;
  A1, B1, C1 : Extended;
  CX, CY, R : Extended;
  MinX, MaxX, MinY, MaxY : Extended;

  FUNCTION MyRoundA(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundA := A
    ELSE
      MyRoundA := Trunc(A)+1
  END;

  FUNCTION MyRoundB(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundB := A
    ELSE
      MyRoundB := Trunc(A)-1
  END;

BEGIN
  ReadLn(X0, Y0);
  ReadLn(X1, Y1);
  ReadLn(X2, Y2);
  MinX := X0;
  IF MinX > X1 THEN MinX := X1;
  MaxX := X0;
  IF MaxX < X1 THEN MaxX := X1;
  MinY := Y0;
  IF MinY > Y1 THEN MinY := Y1;
  MaxY := Y0;
  IF MaxY < Y1 THEN MaxY := Y1;
  CX := (X0+X1)/2;
  CY := (Y0+Y1)/2;
  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;
  IF (A <> 0) THEN
    BEGIN
      A0 := B/A;
      B0 := -1;
      C0 := CY-A0*CX;
    END
  ELSE
    BEGIN
      A0 := 1;
      B0 := 0;
      C0 := -CX;
    END;
  CX := (X0+X2)/2;
  CY := (Y0+Y2)/2;
  A := (Y2-Y0);
  B := (X0-X2);
  C := X2*Y0-X0*Y2;
  IF (A <> 0) THEN
    BEGIN
      A1 := B/A;
      B1 := -1;
      C1 := CY-A1*CX;
    END
  ELSE
    BEGIN
      A1 := 1;
      B1 := 0;
      C1 := -CX;
    END;

  {center}
  CX := (B0*C1-B1*C0)/(A0*B1-A1*B0);
  CY := (A1*C0-A0*C1)/(A0*B1-A1*B0);
  {radius}
  R := Sqrt(Sqr(X0-CX)+Sqr(Y0-CY));

  {Line (X0,Y0) to (X1,Y1)}

  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;

  IF (A*X2+B*Y2+C)*(A*(CX-R)+B*CY+C) >= 0 THEN MinX := CX-R;
  IF (A*X2+B*Y2+C)*(A*(CX+R)+B*CY+C) >= 0 THEN MaxX := CX+R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY-R)+C) >= 0 THEN MinY := CY-R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY+R)+C) >= 0 THEN MaxY := CY+R;

  MinX := MyRoundB(MinX);
  MaxX := MyRoundA(MaxX);
  MinY := MyRoundB(MinY);
  MaxY := MyRoundA(MaxY);

  IF MinX < -1000 THEN MinX := -1000;
  IF MinY < -1000 THEN MinY := -1000;
  IF MaxX > 1000 THEN MaxX := 1000;
  IF MaxY > 1000 THEN MaxY := 1000;


  Write((MaxX-MinX)*(MaxY-MinY):0:0);
END.
Why my program still WA? Please help me! Thank you!
Послано Grebnov Ilya[ISPU] 1 апр 2003 22:43
{$N+}
{$E-}
VAR

  X0, X1, X2 : Extended;
  Y0, Y1, Y2 : Extended;
  A, B, C : Extended;
  A0, B0, C0 : Extended;
  A1, B1, C1 : Extended;
  CX, CY, R : Extended;
  MinX, MaxX, MinY, MaxY : Extended;

  FUNCTION MyRoundUp(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundUp := Trunc(A)
    ELSE
      IF A > 0 THEN
        MyRoundUp := Trunc(A+1)
    ELSE
      MyRoundUp := Trunc(A)
  END;

  FUNCTION MyRoundDown(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundDown := Trunc(A)
    ELSE
      IF A < 0 THEN
        MyRoundDown := Trunc(A-1)
    ELSE
      MyRoundDown := Trunc(A);
  END;

BEGIN

  ReadLn(X0, Y0);
  ReadLn(X1, Y1);
  ReadLn(X2, Y2);

  MinX := X0;
  IF MinX > X1 THEN MinX := X1;
  MaxX := X0;
  IF MaxX < X1 THEN MaxX := X1;
  MinY := Y0;
  IF MinY > Y1 THEN MinY := Y1;
  MaxY := Y0;
  IF MaxY < Y1 THEN MaxY := Y1;

  CX := (X0+X1)/2;
  CY := (Y0+Y1)/2;

  {Line (X0,Y0) to (X1,Y1)}
  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;

  IF (Y1 <> Y0) THEN
    BEGIN
      A0 := B/A;
      B0 := -1;
      C0 := CY-A0*CX;
    END
  ELSE
    BEGIN
      A0 := 1;
      B0 := 0;
      C0 := -CX;
    END;

  CX := (X0+X2)/2;
  CY := (Y0+Y2)/2;

  {Line (X0,Y0) to (X2,Y2)}
  A := (Y2-Y0);
  B := (X0-X2);
  C := X2*Y0-X0*Y2;

  IF (Y2 <> Y0) THEN
    BEGIN
      A1 := B/A;
      B1 := -1;
      C1 := CY-A1*CX;
    END
  ELSE
    BEGIN
      A1 := 1;
      B1 := 0;
      C1 := -CX;
    END;

  {center}
  CX := (B0*C1-B1*C0)/(A0*B1-A1*B0);
  CY := (A1*C0-A0*C1)/(A0*B1-A1*B0);

  {radius}
  R := Sqrt(Sqr(X0-CX)+Sqr(Y0-CY));

  {Line (X0,Y0) to (X1,Y1)}
  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;

  IF (A*X2+B*Y2+C)*(A*(CX-R)+B*CY+C) > 0 THEN MinX := CX-R;
  IF (A*X2+B*Y2+C)*(A*(CX+R)+B*CY+C) > 0 THEN MaxX := CX+R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY-R)+C) > 0 THEN MinY := CY-R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY+R)+C) > 0 THEN MaxY := CY+R;

  MaxX := MyRoundUp(MaxX);
  MaxY := MyRoundUp(MaxY);
  MinX := MyRoundDown(MinX);
  MinY := MyRoundDown(MinY);

  Write((MaxX-MinX)*(MaxY-MinY):0:0);

END.