题目地址
这道题,开始用着自己方法做不出来,看了discuss,发现有人打表,又想着用打表,可是头又铁,硬硬用着自己方法逻辑来判断,终究还是做了出来
想法是这样:对于输入的点,并没有说输入的点是哪个是始点哪个终点,要判断。看了discuss,原来自己判断的方法错了,应该x 和 y加起来比较,判断出始点和终点。这个时候始点的话,有问题,那就是如果始点是零点,那么需要先加上一,然后将(0,1)变成始点,再判断两个点是否在45°的线上,在直接算,不在就话,始点(x,y)加上一段距离,到(x+y,0)的点上,而终点(x, y)也加上一段距离到(0, x+y)点上,之后就可以循环算距离了,超级无敌麻烦。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
int main(void) {
int N;
scanf("%d", &N);
while(N--) {
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
int r_x, r_y, l_x, l_y;
double sum = 0;
//开始判断始点和终点
if(x1 + y1 >= x2 + y2) {
if(x1 + y1 == x2 + y2) {
if(y1 > y2) {
r_x = x2;
r_y = y2;
l_x = x1;
l_y = y1;
}
else {
r_x = x1;
r_y = y1;
l_x = x2;
l_y = y2;
}
}
else {
r_x = x1;
r_y = y1;
l_x = x2;
l_y = y2;
}
}
else {
r_x = x2;
r_y = y2;
l_x = x1;
l_y = y1;
}
//结束判断始点和终点
//开始判断是否是在45°的线上
if(l_x + l_y == r_x + r_y) {
sum += sqrt((l_x - r_x) * (l_x - r_x) + (l_y - r_y) * (l_y - r_y));
printf("%.3f\n", sum); //在的话直接算,然后输出
continue;
}
//开始判断始点是不是0点
else {
if(l_x == 0 && l_y == 0) { //是的话,sum 加 1,然后变换始点
sum += 1;
l_x = 0;
l_y = 1;
}
if(l_x + l_y == r_x + r_y) { // 因为变化了始点,需要重新看是不是在45°线上
sum += sqrt((l_x - r_x) * (l_x - r_x) + (l_y - r_y) * (l_y - r_y));
printf("%.3f\n", sum) ;
continue;
}
else { //都不是就循环算了
sum += sqrt(2 * l_y * l_y) + sqrt(2 * r_x * r_x);
for(int i = l_x + l_y; i < r_x + r_y; i++) {
sum += sqrt(i * i + (i + 1) * (i + 1));
}
for(int i = r_x + r_y - 1; i > l_x + l_y; i--) {
sum += sqrt(i * i * 2);
}
printf("%.3f\n", sum);
}
}
}
return 0;
}