蜂窝小区最短距离的坐标系解法

这篇博客介绍了一种解决蜂窝小区最短距离问题的坐标系解法。通过定义XYZ坐标,可以计算出任意两个编号的蜂窝小区之间的最短路径。博客详细讲解了如何初始化蜂窝小区信息、计算最短距离以及清空相关信息,并提供了相关接口的实现代码。
摘要由CSDN通过智能技术生成

如下图所示,蜂窝小区,以1为中心,顺时针编号,编号最大限定为100000。


求任意两编号之间的最短距离。

两个相邻小区的距离为1

示例:19到30的最短距离为5

 

实现如下三个接口:

/************************************************************************

Description  : 初始化蜂窝小区信息

Prototype    : void InitCellularDistrict(int iMaxSeqValue)

               Input Param  : iMaxSeqValue 蜂窝小区的最大值编号,注:编号从1开始

               Output Param : 无

               Return Value : 成功返回0,失败返回-1

/************************************************************************/

int InitCellularDistrict(int iMaxSeqValue)

{

    return -1;

}

 

/************************************************************************

Description  : 计算出蜂窝小区指定两点(编号值)之间的最短距离

Prototype    : int GetShortestPathLength(int iFirstValue, int iSecondValue)

               Input Param  : iFirstValue 起点编号值, iSecondValue 终点编号值

               Output Param : 无

               Return Value : 计算成功返回最短距离,失败返回-1

/************************************************************************/

int GetShortestPathLength(int iFirstValue, int iSecondValue)

{

    return -1;

}

 

/************************************************************************

Description  : 清空相关信息

Prototype    : void Clear()

               Input Param  : 无

               Output Param : 无

               Return Value : 无

/************************************************************************/

void Clear()

{

 

}

解题思路:

1、约定:定义XYZ坐标如上图所示,X轴往左平移n个单位定义为x=-n,往右平移n个单位则定义为x=n,同理,Y轴往左上平移n个单位定义为y=n,Y轴往右下平移n个单位定义为y=-n,Z轴往右上平移n个单位定义为z=n,Z轴往左下平移n个单位定义为z=-n。如下图所示:

 

2、定义点坐标:有了前面的约定,整个区域内的任何一个点都可以从序号为1的蜂窝开始沿坐标轴垂直方向多次移动到达。然后我们就可以定义每个点坐标如何表示了,如下图所示:


我们取29这个点来举例说明,它所在X轴左平移2个单位处,因此x=-2,它所在Y轴左上平移3个单位处

/************************************************************************ Description : 初始化蜂窝小区信息 Prototype : void InitCellularDistrict(int iMaxSeqValue) Input Param : iMaxSeqValue 蜂窝小区的最大值编号,注:编号从1开始 Output Param : 无 Return Value : 成功返回0,失败返回-1 /************************************************************************/ int InitCellularDistrict(int iMaxSeqValue) { if(iMaxSeqValue < 1 || iMaxSeqValue > 100000) { return -1; } g_maxvalue = iMaxSeqValue; return 0; } /************************************************************************ Description : 计算出蜂窝小区指定两点(编号值)之间的最短距离 Prototype : int GetShortestPathLength(int iFirstValue, int iSecondValue) Input Param : iFirstValue 起点编号值, iSecondValue 终点编号值 Output Param : 无 Return Value : 计算成功返回最短距离,失败返回-1 /************************************************************************/ int GetShortestPathLength(int iFirstValue, int iSecondValue) { if(iFirstValue > g_maxvalue || iFirstValue < 1 || iSecondValue > g_maxvalue || iSecondValue < 1) { return -1; } int x_1 = 0; int y_1 = 0; int z_1 = 0; int x_2 = 0; int y_2 = 0; int z_2 = 0; GetCoordinate(iFirstValue,&x_1,&y_1,&z_1); //获取坐标 GetCoordinate(iSecondValue,&x_2,&y_2,&z_2); int distance_x = (x_1 > x_2)? (x_1 - x_2):(x_2 - x_1); int distance_y = (y_1 > y_2)? (y_1 - y_2):(y_2 - y_1); int distance_z = (z_1 > z_2)? (z_1 - z_2):(z_2 - z_1); int shortest_distance = distance_x > distance_y? distance_x:distance_y; shortest_distance = shortest_distance > distance_z? shortest_distance:distance_z; return shortest_distance; } /************************************************************************ Description : 清空相关信息 Prototype : void Clear() Input Param : 无 Output Param : 无 Return Value : 无 /************************************************************************/ void Clear() { g_maxvalue = 0; }
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值