HDOj2073无限的路笔记

题目地址
这道题,开始用着自己方法做不出来,看了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;
}                   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Greatljc

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值