我正在解决uva在线评委(http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1204)的问题10263(铁路)并为我的代码获得错误的答案。 在与朋友(他也解决了问题并接受了Accepted)讨论后,他看了我的代码并且与他非常相似(例如,所有的几何函数都是相同的,因为我们正在作为一个团队进行培训ICPC和使用相同的代码库)。
所以,在我开始尝试一次改变以查看问题后,我发现了这种奇怪的行为。
我的初始代码(错误答案)就是这个:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <limits>
#define EPS 1e-9
using namespace std;
struct point {
double x, y;
point(double _x, double _y) { x = _x, y = _y; } //EDITED
point() { x = 0.0, y = 0.0; }
};
double dist(point p1, point p2) {
return hypot(p1.x - p2.x, p1.y - p2.y);
}
double distToLine(point p, point A, point B, point *c) {
double scale = (double) ((p.x - A.x) * (B.x - A.x) + (p.y - A.y) * (B.y - A.y)) / ((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y));
c->x = A.x + scale * (B.x - A.x);
c->y = A.y + scale * (B.y - A.y);
return dist(p, *c);
}
double distToLineSegment(point p, point A, point B, point* c) {
if ((B.x-A.x) * (p.x-A.x) + (B.y-A.y) * (p.y-A.y) < EPS) {
c->x = A.x; c->y = A.y;
return dist(p, A);
}
if ((A.x-B.x) * (p.x-B.x) + (A.y-B.y) * (p.y-B.y) < EPS) {
c->x = B.x; c->y = B.y;
return dist(p, B);
}
return distToLine(p, A, B, c);
}
int main() {
int Mx, My;
while (cin >> Mx) {
int N, x, y;
cin >> My >> N;
point A, B, aux, res, M(Mx, My);
double dres = numeric_limits<double>::infinity(), d;
cin >> x >> y;
A = point(x,y);
for (int i=0; i<N; i++) {
cin >> x >> y;
B = point(x,y);
d = distToLineSegment(M, A, B, &aux);
if (d < dres) {
dres = d;
res = aux;
}
A = B;
}
printf("%.4f\n%.4f\n",res.x,res.y);
}
}
现在,在改变这一行之后:
int Mx, My;
while (cin >> Mx) {
int N, x, y;
cin >> My >> N;
point A, B, aux, res, M(Mx, My);
要
point M;
while (cin >> M.x) {
int N, x, y;
cin >> M.y >> N;
point A, B, aux, res;
我的解决方案被接受了。 谁能帮助我了解读取int值然后创建点的问题是什么?在什么可能的原因可能这个代码“行为不端”并产生不同于另一个的答案? 另外,关于为什么“M”是唯一的问题的任何想法? (我一如既往地读着“A”和“B”,并没有影响到答案,只有我读“M”的方式必须改变)。
任何能帮助我理解正在发生的事情的提示都会非常感激!
编辑: 在“将其更改回错误版本”时写错了构造函数,抱歉。
答案 0 :(得分:1)
差异是@ jhonchen902在评论中建议:问题指定输出必须是小数点后四位数的浮点数。
在您的第一个版本中,您使用整数。