Условие задачи
На основе
способа
| решение: |
| #include <fstream>
using namespace std;
//-------------------------------------------
int main()
{
ifstream fileIn;
fileIn.open("input.txt");
ofstream fileOut;
fileOut.open("output.txt");
int ax, ay, bx, by;
fileIn >> ax >> ay >> bx >> by;
int A1 = by-ay;
int B1 = ax-bx;
int C1 = bx*ay-ax*by;
fileIn >> ax >> ay >> bx >> by;
int A2 = by-ay;
int B2 = ax-bx;
int C2 = bx*ay-ax*by;
int det = A1*B2-A2*B1;
if(det!=0){
double x = -1.0*(C1*B2-C2*B1)/det;
double y = -1.0*(A1*C2-A2*C1)/det;
fileOut.setf(ios::scientific);
fileOut << "1 " << x << " " << y << endl;
}else{
if(A1*C2-A2*C1==0 && C1*B2-C2*B1==0) fileOut << "2" << endl;
else fileOut << "0" << endl;
}
fileIn.close();
fileOut.close();
return 0;
}
|
| |
И указанное выше решение, и решение на основе разбора к задаче приводит к выполнению всех тестов, кроме №14 — "Неправильный ответ".
Используя assert , выяснил, что ошибка возникает в блоке:
if(det!=0){
double x = -1.0*(C1*B2-C2*B1)/det;
double y = -1.0*(A1*C2-A2*C1)/det;
fileOut.setf(ios::scientific);
fileOut << "1 " << x << " " << y << endl;
}
При этом вычисляются такие x и y, которые не удовлетворяют уравнениям прямых, например, |A1*x+B1*y+C1|>1e-9.
Подскажите пожалуйста, в чем проблема? Неужели есть прямые, для которых детерминант det = A1*B2-A2*B1 отличный от нуля, а точки пересечения не существует?