[请教] 给定起点和终点的坐标,如何产生一条随机的路径?

wyl1267 2006-02-20 09:30:48
请教一个编程问题:
在N*N的棋盘中,若给定起点和终点的坐标,如何产生一条随机的路径?
...全文
1263 55 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyl1267 2006-03-13
  • 打赏
  • 举报
回复
你研究的问题都很深奥的,如迷宫,接龙,魔方之类的,不愧是北大出来的!
你还编过些什么游戏啊,能不能让我领略一下?

我最近的一个拙作发布在:
http://data.gameres.com/showmessage.asp?TopicID=47849
有兴趣进去看看,欢迎点评。

还有,你编的<人工智能用于游戏编程>一书出版了吗?哪里有买啊?
zzwu 2006-03-10
  • 打赏
  • 举报
回复

wyl1267(寒蝉) :

确实,这题没有想象的那样简单,尽管你的贴结了(谢谢你),我的贴还没有结,我准备把这一想法继续完善下去.

我现在暂时把此转换点的位置的事情搁一搁,先考虑如何随机产生点列.

可以有2种办法:

1. 一种是使所有点不在相同行相同列,这样,如果是n*n点阵,只能允许布置n个点.
2. 另一种是使所有点不在已布线上即可,这就可以产生更多的点了.

第一种方法我已经编好了程序,现正在编第二钟方案.

我以前在北大读过书,现在已不在北大了.

我前面提到的方案都是晚上睡在床上考虑的,化的时间可能主要是编写贴子的时间(图不好画).


zzwu 2006-03-10
  • 打赏
  • 举报
回复
下面是我不久前提问的2个游戏算法问题:

http://topic.csdn.net/T/20050613/15/4078974.html

http://community.csdn.net/Expert/topic/4535/4535995.xml?temp=.388653
zzwu 2006-03-10
  • 打赏
  • 举报
回复
我讲的第二种方法就是:在随机产生新点时,要避开已占有连线的那些位置.
而第一种方法则要避开已布点的整个行和列,即使不占满行或列,也不再加新点.

我想,这种想法和你的思想也差不多.

我也喜欢编游戏玩,我以前遍过一些游戏,感到困难的也是算法问题.
我已经在CSDN上提问过一些算法问题.
wyl1267 2006-03-10
  • 打赏
  • 举报
回复
zzwu(未名):

你的第1种方法好象有局限性,第2种我还不很明白。
刚才我倒忽然想出了一个方法,你看行不行:
和随机产生点列的方法想反,在方阵中随机布置一些“禁区”或叫作“障碍”,“禁区”的大小不一,也是随机的。从起点至终点必须绕开“禁区”,这样可采用路径搜索如A*算法来实现。这只是一个设想,没有试过。

看了你发的贴和一些回复,好象都是有关算法的,其实编程的核心问题就是算法问题,也是编程的难点所在,是吗?
我原来是学电子专业的,后来对编程也挺感兴趣,在业余时间编过几个小游戏(不知你对这玩艺儿有没有兴趣?),也曾为算法问题所困惑,由于我完全是靠自学的,周围也没有编程问题的讨论环境,正在想找人交流探讨一下这方面的思路。

在贴子里表达起来毕竟有限,图象和文件等都不能传送,以后方便的话可以发email给我。
zzwu 2006-03-08
  • 打赏
  • 举报
回复
[答]
Ytemp=Y6,
Y6=Y5,
Y5=Y4,
Y4=Y2,
Y2=Y1,
Y1=Y3=Ytemp

zzwu 2006-03-08
  • 打赏
  • 举报
回复
其实,只要弄清了前面的修改思想,这一问题也不难.
wyl1267 2006-03-08
  • 打赏
  • 举报
回复
zzwu(未名):
看来这题没有想象的那样简单,有待进一步讨论,不管方案是否可行,很佩服你的钻研精神,你为这道题花了很多时间吧?
你现在是学生吗,我猜是北大的吗?

也感谢楼上各位提供思路,本贴将要结贴,以后可发Email给我:wyl1267[AT]tom[DOT]com ([AT]= @, [DOT]=. ) ,欢迎来信继续讨论!
zzwu 2006-03-07
  • 打赏
  • 举报
回复
如再来一个P6:

,0*****,,,,,,,,,,,
,,,,,,*,,6,,,,,,,,
,,,,,,*,,*,,,,,,,,
,,****1,,*,3*****,
,,*,,,,,,*,*,,,,*,
,,*,,,,,,*,*,,,,*,
,,*,,,,,,*,*,,,,*,
,,2*********,,,,*,
,,,,,,,,,*,,,,,,*,
,,,,,,,,,*,,,,,,*,
,,,,,,,,,*,,,,,,*,
****************4,
*,,,,,,,,*,,,,,,,,
5*********,,,,,,,,

则要这样改:

,0*****,,,,,,,,,,,
,,,,,,*,,,,,,,,,6,
,,,,,,*,,,,,,,,,*,
,,****1,,3**,,,,*,
,,*,,,,,,*,*,,,,*,
,,*,,,,,,*,*,,,,*,
,,*,,,,,,*,*,,,,*,
,,2*******,*,,,,*,
,,,,,,,,,,,*,,,,*,
,,,,,,,,,,,*,,,,*,
,,,,,,,,,,,*,,,,*,
***********4,,,,*,
*,,,,,,,,,,,,,,,*,
5****************,

即:X6=X4, X4=X3, X3=X6







zzwu 2006-03-07
  • 打赏
  • 举报
回复
,0*****,,,,,,,,,,,
,,,,,,*,,,,,,,,,,
,,,,,,*,,,,,,,,,,
,,,,,,*,,,,3*****
,,,,,,*,,,,*,,,,*
,,,,,,*,,,,*,,,,4
,,,,,,*,,,,*,,,,,
,,****1,,,,*,,,,,
,,*,,,,,,,,*,,,,,
,,*,,,,,,,,*,,,,,
,,*,,,,,,,,*, ,,,,
,,2*********,,,,,
,,,,,,,,,,,,,,,,,
5 ,,,,,,,,,,,,,,,,


改成这样:

,0*****,,,,,,,,,,,
,,,,,,*,,,,,,,,,,,
,,,,,,*,,,,,,,,,,,
,,****1,,,,3*****,
,,*,,,,,,,,*,,,,*,
,,*,,,,,,,,*,,,,*,
,,*,,,,,,,,*,,,,*,
,,2*********,,,,*,
,,,,,,,,,,,,,,,,*,
,,,,,,,,,,,,,,,,*,
,,,,,,,,,,,,,,,,*,
****************4,
*,,,,,,,,,,,,,,,,,
5,,,,,,,,,,,,,,,,,
即Y4=Y2, Y2=Y1, Y1=Y3




zzwu 2006-03-07
  • 打赏
  • 举报
回复
,0*****,,,,,,,,,,,
,,,,,,*,,,,,,,,,,
,,,,,,*,,,,,,,,,,
,,,,,,*,,,,3*****
,,,,,,*,,,,*,,,,*
,,,,,,*,,,,*,,,,4
,,,,,,*,,,,*,,,,,
,,****1,,,,*,,,,,
,,*,,,,,,,,*,,,,,
,,*,,,,,,,,*,,,,,
,,*,,,,,,,,*, , , , ,
,,2*********, , , , ,
,,,,,,,,,,,,, , , , ,
5 ,, ,,,,,,,,,, , , , ,


改成这样:

,0*****,,,,,,,,,,,
,,,,,,*,,,,,,,,,,,
,,,,,,*,,,,,,,,,,,
,,****1,,,,3*****,
,,*,,,,,,,,*,,,,*,
,,*,,,,,,,,*,,,,*,
,,*,,,,,,,,*,,,,*,
,,2*********,,,,*,
,,,,,,,,,,,,,,,,*,
,,,,,,,,,,,,,,,,*,
,,,,,,,,,,,,, , , , *,
****************4,
*,,,,,,,,,,,, , , , ,
5,, ,,,,,,,,,, , , , ,

即Y4=Y2, Y2=Y1, Y1=Y3



zzwu 2006-03-07
  • 打赏
  • 举报
回复
难题来了:在

,0*****,,,,,,,,,,,
,,,,,,*,,,,,,,,,6,
,,,,,,*,,,,,,,,,*,
,,****1,,3**,,,,*,
,,*,,,,,,*,*,,,,*,
,,*,,,,,,*,*,,,,*,
,,*,,,,,,*,*,,,,*,
,,2*******,*,,,,*,
,,,,,,,,,,,*,,,,*,
,,,,,,,,,,,*,,,,*,
,,,,,,,,,,,*,,,,*,
***********4,,,,*,
*,,,,,,,,,,,,,,,*,
5****************,

的基础上,如何加下面的P7:

,0*****,,,,,,,,,,,
,,,,,,*,,,,,,,,,,,
,,,,⊕⊕⊕⊕⊕⊕⊕⊕⊕⊕⊕⊕6,
,,,,⊕,*,,,,,,,,,*,
,,**⊕*1,,3**,,,,*,
,,*,⊕,,,,*,*,,,,*,
,,*,⊕,,,,*,*,,,,*,
,,*,⊕,,,,*,*,,,,*,
,,2*⊕*****,*,,,,*,
,,,,⊕,,,,,,*,,,,*,
,,,,⊕,,,,,,*,,,,*,
,,,,⊕,,,,,,*,,,,*,
****⊕******4,,,,*,
*,,,⊕,,,,,,,,,,,*,
5***⊕************,
,,,,⊕,,,,,,,,,,,,,
,,,,⊕,,,,,,,,,,,,,
,,,,7,,,,,,,,,,,,,

zzwu 2006-03-06
  • 打赏
  • 举报
回复
最后一步仅仅是把P2与P4两个点的y分量对换一下而已.
zzwu 2006-03-06
  • 打赏
  • 举报
回复
接前面,我向前再看一步:

第3点:

,0*****,,,,,
,,,,,,*,,,,,
,,,,,,*,,,,3
,,,,,,*,,,,*
,,2***+*****
,,*,,,*,,,,,
,,*,,,*,,,,,
,,*,,,*,,,,,
,,****1,,,,,
,,,,,,,,,,,,

相交了,改为下面的路线:

,0*****,,,,,
,,,,,,*,,,,,
,,,,,,*,,,,3
,,,,,,*,,,,*
,,****1,,,,*
,,*,,,,,,,,*
,,*,,,,,,,,*
,,*,,,,,,,,*
,,2*********
,,,,,,,,,,,,

加入第4点:

,0*****,,,,,
,,,,,,*,,,,,
,,,,,,*,,,,3*****
,,,,,,*,,,,*,,,,*
,,****1,,,,*,,,,*
,,*,,,,,,,,*,,,,*
,,*,,,,,,,,*,,,,4
,,*,,,,,,,,*
,,2*********
,,,,,,,,,,,,


加入第5点:

,0*****,,,,,
,,,,,,*,,,,,
,,,,,,*,,,,3*****
,,,,,,*,,,,*,,,,*
,,****1,,,,*,,,,*
,,*,,,,,,,,*,,,,*
****************4
*,*,,,,,,,,*,,,,,
*,2*********,,,,,
*,,,,,,,,,,,,,,,,
5,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,


与前面线段相交了,改为下面的路线:

,0*****,,,,,
,,,,,,*,,,,,
,,,,,,*,,,,3*****
,,,,,,*,,,,*,,,,*
,,****1,,,,*,,,,*
,,*,,,,,,,,*,,,,*
,,2*********,,,,*
,,,,,,,,,,,,,,,,*
****************4
*,,,,,,,,,,,,,,,,
5,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,


修改时,要保证点的数目不变,点的位置要变,但新点的坐标都
是利用已有点的坐标“重组”得到。

现在,问题变成:寻找新点和原有点的坐标的关系。




wyl1267 2006-03-06
  • 打赏
  • 举报
回复
,0*****,,,,,,,,,,
,,,,,,*,,,,,,,,,,
,,,,,,*,,,,3*****
,,,,,,*,,,,*,,,,4
,,****1,,,,*,,,,,
,,*,,,,,,,,*,,,,,
,,*,,,,,,,,*,,,,,
,,*,,,,,,,,*, , , , ,
,,2*********, , , , ,
,,,,,,,,,,,,, , , , ,
5 ,, ,,,,,,,,,, , , , ,

如果第4点在上面的位置怎么办啊?
zzwu 2006-03-06
  • 打赏
  • 举报
回复
而前面加P3时的修改,仅仅是把P1与P2两个点的y分量对换一下而已.
寻开心 2006-03-03
  • 打赏
  • 举报
回复
“每加入一点,就画对应的一根“水平+垂直”线,并立刻处理掉这一“水平+垂直”线与已有线的相交”
这个可不一定很容易就实现,也许要绕很多弯才可以达到的
这个在某种程度上等同于,走迷宫了, :)
假设你的迷宫设好了,我把A点放在迷宫的入口,B点放在迷宫的出口
你的处理线的方法,就等同于走迷宫的算法啦
zzwu 2006-03-02
  • 打赏
  • 举报
回复
我也在考虑中,我的想法是:
每加入一点,就画对应的一根“水平+垂直”线,并
立刻处理掉这一“水平+垂直”线与已有线的相交,
这样一来,以后就永远不会复杂情况了。

问题剩下2个:
1. 如何防止随机产生的新点、新线不与原来的重合?
2. 新点、新线与原来的点、线有多次相交如何处理?

我认为,
要解决1,必须对新点的随机产生方法有所限制。
要解决2,原则上是:遇到交点时,一个一个地处理。


wyl1267 2006-03-01
  • 打赏
  • 举报
回复
上述的处理方法只是对一个个例,遇到复杂的情况怎么办?
有没有通用的处理算法?
zzwu 2006-03-01
  • 打赏
  • 举报
回复
抱歉,上面图中点的标识方法错了,点的个数只有3个,
从一点到其下一点,总是先走水平再走垂直,如下:


,0*****,,,,,
,,,,,,*,,,,,
,,,,,,*,,,,3
,,,,,,*,,,,*
,,2***+*****
,,*,,,*,,,,,
,,*,,,*,,,,,
,,*,,,*,,,,,
,,****1,,,,,
,,,,,,,,,,,,

更合理的修改方式,是改为下面的路线:

,0*****,,,,,
,,,,,,*,,,,,
,,,,,,*,,,,3
,,,,,,*,,,,*
,,****1,,,,*
,,*,,,,,,,,*
,,*,,,,,,,,*
,,*,,,,,,,,*
,,2*********
,,,,,,,,,,,,

这样,点的总数保持不变,而且,虽然一些点的位置改变了,但
这些新点的坐标分量都是利用原有点的坐标分量交换得到的。

加载更多回复(35)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧