你来思考思考【高效快速的路径寻址算法】

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;

 

图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

 

图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. 撰文初衷:活跃一下生锈了的大脑,研究研究有趣好玩的算法。

 

posted @ 2010-08-25 12:57  走向卓越  阅读(938)  评论(4编辑  收藏  举报