你来思考思考【高效快速的路径寻址算法】
1.[备注:寻址过程以逆时针为基准;方向表示规则:东(0),北(1),西(2)南(3),如图大黑体数字0~3]
如图1:A区坐标:0,0 那么A区产生四条路径:S0(A 0 0 0),S1(A 0 0 1),S2(A 0 0 2),S3(A 0 0 3),这样变形成了一条路径:S0—>S1—>S2—>S3;
![](https://images.cnblogs.com/cnblogs_com/redak/截图02.png)
图1
2.每个区域之间必有一边相连,如以下均为合法的区域组织图:
(1)如图2:我们以A 0 0 1为起始点,探寻路径:
A 0 0 1—>A 0 0 2—>(此处是不是遇到问题了?A 0 0 2与A 1 -1 指向路径相同,这时我们只需选择一个,因为这个表示值在数据库中只会存在一个,稍后我们在来描述表结构及其数值存放规则)
一个完整路径:A 0 0 1—>A 0 0 2—>A 1 -1 2 —>A 2 0 2—> A 2 0 3—>A 2 0 0—>A 1 0 0—>A 0 0 0
![](https://images.cnblogs.com/cnblogs_com/redak/截图03.png)
图2
(2)如图3:这个就稍微复杂些了,我们同样任意选取一条“多区覆盖一个路径点”来处理:
我们以A 2 -3 0为起始点,探寻路径:
A 2 -3 0—>A 2 -1 3—>A 2 0 3—>A 2 0 0—>A 1 0 0—>A 0 0 0—>A 0 0 1—>A 1 -1 1—>
A 1 -2 1—>A 1 -3 1—>A 1 -3 2—>A 2 -3 2—>A 3 -3 2—>A 3 -3 3—>A 3 -3 0
可能这个路径你会有很多疑虑或者思考,先别急,我们继续往下看。
图3
3.理论拒绝组合区域的情况:(回字型与十字型组合不做算法考范围内)
备注:回字型导致生成两条路径,十字型导致一个区域被包围,因此不做考虑
图4(回字型)
图5(十字型)
4.以上大概描述了路径的寻址过程,如有描述不详细或不当的地方,请大家留言或者MailTo:red.ak@hotmail.com
接下来我们将描述一下数据库中存放的数据,别忘了我们是要利用这些数据来进行路径寻址的。
表1 路径点表结构
序号 |
列名 |
数据类型 |
长度 |
主键 |
允许空 |
说明 |
1 |
AreaID |
varchar |
100 |
是 |
否 |
区域ID |
2 |
AreaX |
int |
4 |
是 |
否 |
X坐标 |
3 |
AreaY |
int |
4 |
是 |
否 |
Y坐标 |
4 |
DirectID |
int |
4 |
是 |
否 |
路径点方向 |
表2 区域表结构
序号 |
列名 |
数据类型 |
长度 |
主键 |
允许空 |
说明 |
1 |
AreaID |
varchar |
100 |
是 |
否 |
区域ID |
2 |
AreaX |
int |
4 |
是 |
否 |
X坐标 |
3 |
AreaY |
int |
4 |
是 |
否 |
Y坐标 |
备注1:DirectID取值范围0~3,东(0),北(1),西(2)南(3);
备注2:“多区覆盖一个路径点”在表一中只会存在一条数据,存在哪条我们需要进行路径判断的;
如图3:A 2 -1 2, A 1 -2 3,A 2 -3 0指向的是同一个路径点,理论情况下最多只有3个区域覆盖同一个路径点;
这时数据库中只会存在其中的一条数据。
备注3:区域表是指某一范围内,我们可假设一个村庄,有很多房子,房子与房子相连,就形成了道路路径。
我们假设有区域组如图2,这时表中存放如下数据:
ID |
AreaID |
AreaX |
AreaY |
1 |
美女A村 |
0 |
0 |
2 |
美女A村 |
1 |
0 |
3 |
美女A村 |
1 |
-1 |
4 |
美女A村 |
2 |
0 |
表1中对应存放数据如下:
ID |
AreaID |
AreaX |
AreaY |
DirectID |
1 |
美女A村 |
0 |
0 |
1 |
2 |
美女A村 |
0 |
0 |
0 |
3 |
美女A村 |
1 |
0 |
0 |
4 |
美女A村 |
2 |
0 |
3 |
5 |
美女A村 |
2 |
0 |
0 |
6 |
美女A村 |
1 |
-1 |
3 |
7 |
美女A村 |
1 |
-1 |
1 |
8 |
美女A村 |
1 |
- |
2 |
备注4:表中存放的数据是无规则的,即可能排列是错乱的。
备注5:“有效路径点”,是指存在于路径点中的数据,如图1:s0的下一个路径点即为s1(逆时针),s0与s1间对角的空白地将不被视为"有效路径点";
5. 我们的问题:
我们需要指定个起始点,这个位置是任意的,当我随机移动N步后到达什么位置(移动一步为一个有效路径点),这就是本文所描述的路径寻址算法;
例如我们以:图3为例,以A 2 -3 0为始发点,移动10步后,走到什么位置?当然从图上很容易计算出来,而我们要做的是根据表中的数据生成一条有序的路径链表,并提供一个初始位置的参数。
备注1:此算法以实现,但我相信不是最好的,如果你有兴趣来研究这个算法并辅以源代码发给我,我也将把我的算法思路回赠给你,以此互相学习,同时希望有幸邀请你进入一个GameTeam.
解决方案关键字:OO,泛型,链表,假设下一步路径的结构
6. 撰文初衷:活跃一下生锈了的大脑,研究研究有趣好玩的算法。