首页 > 试题广场 >

绕距

[编程题]绕距
  • 热度指数:32676 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}在城市道路规划中,绕距是一个很重要的概念,指的是城市中两个重要人员聚集点之间的欧几里得距离(欧氏距离)与曼哈顿距离之差的绝对值。一般而言,绕距越小,则城市交通参与者在这两个地点之间所走的“冤枉路”就越小。

\hspace{15pt}欧几里得距离(Euclidean distance)表示两点间的直线距离;曼哈顿距离(Manhattan distance)表示只沿着横平竖直的城市街道从起点到达终点的最短距离。

\displaystyle d_E = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}

\displaystyle d_M = |x_1 - x_2| + |y_1 - y_2|

\hspace{15pt}定义两点间的绕距为

\displaystyle \Delta = \bigl|d_M - d_E\bigr|

输入描述:
\hspace{15pt}第一行输入两个整数 x_1,y_1-10^4 \leqq x_1,y_1 \leqq 10^4),分别表示起点的横坐标和纵坐标。

\hspace{15pt}第二行输入两个整数 x_2,y_2-10^4 \leqq x_2,y_2 \leqq 10^4),分别表示终点的横坐标和纵坐标。


输出描述:
\hspace{15pt}输出一个实数,表示两点之间的绕距 \Delta。注意,由于浮点数存在误差,只要您的答案与标准答案之间的误差不超过 10^{-6},您的答案就会被认为是正确的。
示例1

输入

0 0
1 1

输出

0.585786437626904951

说明

两点间曼哈顿距离为 2,欧几里得距离为 \sqrt{2},结果为 2- \sqrt{2},约为 0.585786437626904951
#include <stdio.h>
#include <math.h>

int main() {
    int x1,y1,x2,y2;
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    double a = fabs(x1-x2)+fabs(y1-y2)-sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
    printf("%.10lf",a);
    return 0;
}
发表于 2025-12-18 20:25:54 回复(0)
/*2025年10月12日00:49:03
输出一个实数,表示两点之间的绕距
Δ
Δ。注意,由于浮点数存在误差,只要您的答案与标准答案之间的误差不超过10−6,您的答案就会被认为是正确的。*/

# include <stdio.h>
# include <math.h>//包含数学函数的头文件

int main()
{
	int x1, y1, x2, y2;
	double dE, dM, data;

	scanf("%d %d\n", &x1, &y1);
	scanf("%d %d", &x2, &y2);

	dE = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
	//pow() 是 C 标准库 <math.h> 中的一个函数,用于计算一个数的幂。
	// 具体来说,它返回的是第一个参数的第二个参数次幂,即 x^ y。

	dM = (abs(x1 - x2) + abs(y1 - y2));
	//C 库函数 int abs(int x) 返回整数 x 的绝对值。
	//注意:abs() 函数只适用于整数,如果需要计算浮点数的绝对值,需要使用 fabs() 函数。
	
	data = fabs(dM - dE);
	//C 库函数 double fabs(double x) 返回浮点数 x 的绝对值。
	//fabs() 是 C 标准库 <math.h> 中的一个函数,用于计算一个数的绝对值。这个函数在处理数***算时非常有用,可以确保获得数值的非负表示。
	//注意:fabs() 函数可以用于 double、float 和 long double 类型的参数。如果需要计算整数的绝对值,应该使用 abs() 函数。

	printf("%.18f", data);
	return 0;
}

发表于 2025-10-12 01:11:03 回复(0)
#include <math.h>
#include <stdio.h>

int main() {
    int x1, y1, x2, y2 = 0;
    double delta, dE, dM = 0;

    scanf("%d %d\n\r", &x1, &y1);

    scanf("%d %d\n\r", &x2, &y2);

    dE = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));

    dM = (abs(x1 - x2) + abs(y1 - y2));

    delta = fabs(dM - dE);

    printf("%.18lf\n\r", delta);

    return 0;
}
发表于 2025-10-02 17:59:30 回复(0)
#include <stdio.h>
#include<math.h>
int main() {
    int x1, y1, x2, y2;
    scanf("%d %d", &x1, &y1);
    scanf("%d %d", &x2, &y2);
    float de = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
    float dm = (x1 - x2 > 0 ? x1 - x2 : x2 - x1) + (y1 - y2 > 0 ? y1 - y2 : y2 -
                y1);
    printf("%.18f", de - dm > 0 ? de - dm : dm - de);
}

发表于 2025-09-16 23:44:06 回复(0)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int x1,x2,y1,y2;
    scanf("%d %d\n%d %d",&x1,&y1,&x2,&y2);
    int a=x1-x2;
    int b=y1-y2;
    long long c=pow(a,2),d=pow(b,2);
    double dE=sqrt(c+d);
    int e=abs(a);
    int f=abs(b);
    int dM=e+f;
    double final=fabs(dM-dE);
    printf("%.18f",final);
    return 0;
}
发表于 2025-09-08 09:33:41 回复(0)
代码有点多,但我觉得比较简洁。
#include <stdio.h>
#include <stdint.h>
#include <math.h>

typedef struct Point
{
    float x, y;
}Point, *PPoint;

static inline float euclidean_dis_f(PPoint self_pIn, PPoint point_pIn)
{
    float a = powf(self_pIn->x - point_pIn->x, 2);
    float b = powf(self_pIn->y - point_pIn->y, 2);

    return sqrtf(a + b);
}

static inline float abs_f(float num)
{
    uint32_t* p_num = (uint32_t*)&num;
    *p_num &= 0X7FFFFFFF;

    return num;
}

static inline float manhattan_dis_f(PPoint self_pIn, PPoint point_pIn)
{
    float a = self_pIn->x - point_pIn->x;
    float b = self_pIn->y - point_pIn->y;

    return abs_f(a) + abs_f(b);
}

int main() {
    Point   p1 = {.x = .0f, .y = .0f},
            p2 = {.x = .0f, .y = .0f};

    scanf("%f %f", &p1.x, &p1.y);
    scanf("%f %f", &p2.x, &p2.y);

    float result = euclidean_dis_f(&p1, &p2) - manhattan_dis_f(&p1, &p2);

    printf("%f", abs_f(result));

    return 0;
}


发表于 2025-08-04 19:51:06 回复(0)
#include <stdio.h>
#include <math.h>
int main() {
    int x1, y1, x2, y2;
    scanf("%d %d\n", &x1, &y1);
    scanf("%d %d\n", &x2, &y2);
    int x3 = x1 - x2 < 0 ? -(x1 - x2) : x1 - x2;
    int y3 = y1 - y2 < 0 ? -(y1 - y2) : y1 - y2;
    int M = x3 + y3;
    double E = sqrt((x3 * x3) + (y3 * y3));
    double D = M - E < 0 ? -(M - E) : M-E;
    printf("%.6lf", D);
    return 0;
}
发表于 2025-07-06 15:57:13 回复(1)