计蒜客-螺旋困境(模拟)- 解题方案

本文详细解析了计蒜客上一道名为'螺旋困境'的模拟题,涉及数学模拟、等差数列求和及求解两点间距离的方法。通过分析,将解题过程分为确定点所在的层、计算同一层上的距离以及结合等差数列求和公式得出最终距离。解题关键在于正确处理数据类型和理解螺旋结构。
摘要由CSDN通过智能技术生成

计蒜客-螺旋困境(模拟)- 解题方案

问题描述:

小W是一个宅男,喜欢发呆,并幻想一些不切实际的事情。今天,小W又开始做他的白日梦了。他梦见他被困在了一条隧道里,周围漆黑一片。作为一个宅男,小W自然地掏出了手机,打开定位系统,确定了他的位置。又由此在网上搜索到了关于隧道的信息。这条隧道是由一个点向外,呈六角螺旋形展开,并且没有其他的支路。最小的一圈每条边的长度都是1米,边长向外依次增大到2,3…米,如下图所示。
在这里插入图片描述
输入数据以一个整数T<104开头,表示测试数据组数。以下每行为一组测试数据,包括4个整数X1,Y1,X2,Y2,描述了小W所在的位置和出口位置的坐标。所有坐标的绝对值不超过1018,并保证答案不超出64位有符号整数的表示范围。

输出对于每组测试数据输出一行,一个整数,表示小W所在的位置和出口的距离。

样例输入:

2
1 0 0 1
1 1 2 0

样例输出:

2
9

解题思路:

本题是一个典型的数学模拟题,如下图所示(最好自己在题干图的基础上再多画几层,这有助于理解),我们可以观察到每一圈的长度是一个公差为6的等差数列(7,13,19,25…),那么要计算两个点之间的距离,其实只要知道它们在自己所属那一圈行走的距离以及它们之间相差了几圈即可,可以通过等差数列求和公式计算出相差圈数所代表的距离。
在这里插入图片描述
那么,我们可以把整个求解过程分为三步:
1.求出起点和终点分别位于哪一层,用getLayerOfPoint()这个函数来实现。
2.求出起点和终点在它们所在那一层上运动的距离,用getPointDisOfLayer()这个函数来实现。
3.根据等差数列求和公式、两点之间相差的层数以及第2步中所计算出的距离来求解最后的结果。

特别需要注意的是
1.本题中的起点并不一定位于终点的前面,即它们是可以反向的,所以我们在第3步之前若遇到起点位于终点之后的情况,应该交换它们两个的位置。
2.本题计算距离需要求绝对值,但abs()函数无法求解long long型的绝对值,需要自己实现一个求解绝对值的方法。

代码实现:

/*
	思路:模拟,通过等差数列进行定位 
*/ 

#include <iostream>
using namespace std;
typedef long long LL;

// 获取long long 型数字的绝对值,abs()只能获取int 型数字的绝对值 
LL _abs(LL a) {
   
	return a > 0 ? a : (-1 * a);
}

// 根据点的坐标判断某个点在第几层 
LL getLayerOfPoint(LL x, LL y) {
    
	LL absX = _abs(x), absY = _abs(y);
	if (x == 0) return _abs(y)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值