Współliniowość punktów

0

Zadanie http://pl.spoj.com/problems/AL_09_03/
Dostaję błędną odpowiedź. Zapewne przez przekroczeniu zakresu przy iloczynie w warunku. Jak można to inaczej sprawdzić?

#include <cstdio>
#include <vector>
using namespace std;

struct Point {
  Point(){}
  Point(long long int x, long long int y): x(x), y(y) {}
  long long int x,y;
};

int main() {
  int t, n;
  long long int x, y;
  scanf("%d", &t);
  for(int i = 0; i < t; ++i) {
    scanf("%d", &n);
    vector<Point> points;
    bool b = true;
    for(int i = 0; i < n; ++i) {
      scanf("%lld%lld", &x, &y);
      for(int j = 0; j < i; ++j) {
        if(x * points[j].y - points[j].x * y != 0) b = false;
      }
      points.push_back(Point(x, y));
    }

    printf("%s\n", b? "TAK": "NIE");
  }
  return 0;
} 
0

Czy dobrze rozumiem, że w tym kawałku:

if(x * points[j].y - points[j].x * y != 0) b = false;

sprawdzasz czy dwa punkty znajdują się na jednej linii?
Nie musisz sprawdzać, zawsze znajdują się na jednej.

0

Tak faktycznie, nie pomyślałem tutaj.
Czyli powinienem to zrobić tak:

  • wczytać pierwsze dwa punkty,
  • dla każdego następnego sprawdzać współliniowość z tymi dwoma pierwszymi.
    Dobrze myślę?
0

Prawie ... a co jeżeli pierwsze dwa są jednakowe?

0

Dwa pierwsze nie mogą być takie same.
Dalej jest coś źle.

#include <cstdio>
using namespace std;
 
int main() {
  int t, n;
  long long int x1, y1, x2, y2, x3, y3;
  scanf("%d", &t);
  for(int i = 0; i < t; ++i) {
    scanf("%d", &n);
    bool b = true;
    if(n > 2) {
      scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
      n -= 2;
      while((x1 == x2 && y1 == y2) && n-- > 0) scanf("%lld%lld", &x2, &y2);
      while(n-- > 0) {
        scanf("%lld%lld", &x3, &y3);
        if(x1 * y2 + x2 * y3 + x3 * y1 - x3 * y2 - x1 * y3 - x2 * y1 != 0) b = false;
      }
    }
    printf("%s\n", b? "TAK": "NIE");
  }
  return 0;
}  
0

Do standardowego przykładu dodaj jeszcze jeden test składających się z dwóch punktów: 1000 1001 i 1001 1002

0

Nie rozumiem, przecież sam pisałeś, że dwa punkty zawsze są współliniowe. Nie jest tutaj problemem, że wychodzę poza zakres przy mnożeniu?

0

Podaje ci przykład przy którym masz źle:

3
2
1000 1001
1001 1002
4
0 0 
2 2
11 11
-2 -2
3
1 0
0 0 
0 1

jak nie rozumiesz - użyj debugera.

0

Ok poprawiłem, zaliczyłem. Dzięki mistrzu!
Wersja ostateczna

#include <cstdio>
using namespace std;
 
int main() {
  int t, n;
  long long int x1, y1, x2, y2, x3, y3;
  scanf("%d", &t);
  for(int i = 0; i < t; ++i) {
    scanf("%d", &n);
    bool b = true;
    scanf("%lld%lld", &x1, &y1);
    if(n > 1) scanf("%lld%lld", &x2, &y2);
    if(n > 2) {
      n -= 2;
      while((x1 == x2 && y1 == y2) && n-- > 0) scanf("%lld%lld", &x2, &y2);
      while(n-- > 0) {
        scanf("%lld%lld", &x3, &y3);
        if(x1 * y2 + x2 * y3 + x3 * y1 - x3 * y2 - x1 * y3 - x2 * y1 != 0) b = false;
      }
    }
    printf("%s\n", b? "TAK": "NIE");
  }
  return 0;
}  

1 użytkowników online, w tym zalogowanych: 0, gości: 1