--- kod zadania ze spoj ---
To zadanie: http://pl.spoj.com/problems/JWSPLIN/
Oto mój kod:
#include <iostream>
struct DirectionalForm{
double a;
double b;
};
DirectionalForm getDirectionalForm(double x[], double y[]); //obliczmy na podstawie dwóch punktów a i b ze wzoru: y = ax+b
bool isSameLine(DirectionalForm dirFor, double x, double y); //sprawdzamy czy trzeci punkt spełnia to równianie
int main(){
int t;
std::cin>>t;
for(int i=0; i<t; i++){
double x[3];
double y[3];
for(int i=0; i<3; i++){
std::cin>>x[i]>>y[i];
}
auto dirFor = getDirectionalForm(x,y);
//std::cout<<"y = "<<dirFor.a<<"x + "<<dirFor.b<<std::endl;
if(isSameLine(dirFor,x[2],y[2]))
std::cout<<"TAK"<<std::endl;
else
std::cout<<"NIE"<<std::endl;
}
}
DirectionalForm getDirectionalForm(double x[], double y[]){
DirectionalForm toRet;
double divSub;
//mamy wzory z tej stronki: https://www.matemaks.pl/rownanie-prostej-przechodzacej-przez-dwa-punkty.html
if(y[0]-y[1] == 0 || x[0]-x[1] == 0) divSub = 0; //by nie doszło do błędu na wypadek np. 0/0
else divSub = (y[0]-y[1])/(x[0]-x[1]);
toRet.a = divSub;
toRet.b = y[0]-divSub*x[0];
return toRet;
}
bool isSameLine(DirectionalForm dirFor, double x, double y){
return (dirFor.a*x + dirFor.b == y) ? true : false; //sprawdzamy trzeci punkt czy spełnia równanie y = ax + b
}
Powiem krótko, program daje poprawne odpowiedzi i dla mojego kompilatora i dla kompilatora z jakiego korzysta serwis spoj: https://ideone.com/08Fy0m
W przykładzie na stronie mamy:
5
1 2 3 4 5 6
1 3 1 4 1 -3
1 2 -3 4 3 9
2 -1 3 -1 -4 -1
0 0 0 0 0 0
Output:
TAK
TAK
NIE
TAK
TAK
dla " 1 3 1 4 1 -3 " jest to bzdura bo te trzy punkty nie są współliniowe :/
Wydaje mi się że wszystko działa poprawnie ale sędzia daje komunikat że błędna odpowiedź. Wiem że takich pytań dotyczących spoj'u jest sporo ale sami wiecie jaki to jest ból kiedy jesteście pewni że wszystko chodzi jak po maśle a sędzia nie akceptuje i nawet nie da znać dla jakich danych jest zły wynik :(
Dziękuje serdecznie za pomoc.