社区
C语言
帖子详情
求解一个搜索路径的算法.
luoyuanhong2008
2004-03-15 05:10:37
在做一些游行时,我们经常碰到电脑在地图上搜索路径的问题,我们可以把地图设为一个16*16的矩阵A,如:0 0 1.....0 0 1
. .
. .
. .
0 1 1.....1 1 0
元素为0表示可以通过,1表示不可以通过, 寻找一条从元素A[0][0]到A[15][15]的最短路径.
...全文
30
12
打赏
收藏
求解一个搜索路径的算法.
在做一些游行时,我们经常碰到电脑在地图上搜索路径的问题,我们可以把地图设为一个16*16的矩阵A,如:0 0 1.....0 0 1 . . . . . . 0 1 1.....1 1 0 元素为0表示可以通过,1表示不可以通过, 寻找一条从元素A[0][0]到A[15][15]的最短路径.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zhouqingyuan
2004-03-21
打赏
举报
回复
回复人: air82(颓废的笑) ( ) 信誉:100 2004-03-17 22:06:00 得分:0
同意楼上的,看看人工智能吧,初级问题
这种题目好象并不是那么初级吧??
cycloneboy
2004-03-21
打赏
举报
回复
按上下左右顺序搜索,记录一条路径,然后搜索下一条,比较两条谁短,保留短的一条,然后再搜索,以此类推,最后比较出来剩下的一条就是最短路径。
路径可以用链表记录,每个节点保存位置,且在该位置下一步往哪个方向走
struct node{
point p;
int direction;
struct node *pre;
struct node *next;
};
记录第一条路径后,从该路径的最后一个节点开始回溯,将每个节点按上下左右的顺序走完,就能得到所有路径
luoyuanhong2008
2004-03-20
打赏
举报
回复
能不能给一下代码?
air82
2004-03-17
打赏
举报
回复
同意楼上的,看看人工智能吧,初级问题
ZhangYv
2004-03-17
打赏
举报
回复
求最短路径可以用广度游戏搜索,但是使用A*算法的效率会更高
luoyuanhong2008
2004-03-17
打赏
举报
回复
/*---------------------------------------------------------------------------*/
/*把路径上的每一个点保存在一个队列中. */
/*为了方便,用数组mg[][]表示地图,同时在地图周围加一圈"哨兵".
/*----------------------------------------------------------------------------*/
#include<stdio.h>
#define m 15 /*矩阵宽*/
#define n 10/*矩阵长*/
struct
{
int x,y;
int pre;
}sq[400];
int mg[m+1][n+1]; /*用数组初始化地图*/
int zx[8],zy[8];/*可朝周围的八个方向移动,移动到下一个位置时,X,Y轴上的增量*/
void print(rear)/*打印队列中的元素*/
{
int i;
i = rear;
do
{
printf("%d%d",sq[i].x,sq[i].y);
i = sq[i].pre;
}while(i!=0);
}
void malj()
{
int x,y,i,j,v,front,rear;
find=0;
front = rear =1;
sq[1].x=1;
sq[1].y=1;
sq[1].pre = 0;
mg[1][1] = -1;
while(!find&&front<rear)
{
x = sq[front].x;
y = sq[front].y;
for(v=1;v<=8;v++)/*朝周围八个方向搜索*/
i = x+zx[i];
j = y+zy[i];
if(mg[i][j]==0)
{
rear++;
sq[rear].x=i;
sq[rear].y=j;
sq[rear].pre=front;
mg[i][j]=-1;
}
if(i==m&&j==n)/*找到了出口路径*/
{
find=1;
print(rear);
}
front++;
}
if(!find)
printf("Can't find a way!");
}
main()
{
int i ,j;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&mg[i][j]);
for(i=0;i<=m+1;i++) /*加一圈哨兵*/
mg[i][0]=mg[i][n+1]=1;
for(j=0;j<=n+1;j++)
mg[0][j]=mg[m+1][j]=1;
zx[1]=1;zy[1]=0;zx[2]=0;zy[2]=1; /*1表示向东,2表示向南,依次类推*/
zx[3]=-1;zy[3]=0;zx[4]=0;zy[4]=-1;
zx[5]=1;zy[5]=1;zx[6]=-1;zy[6]=-1;
zx[7]=1;zy[7]=-1;zx[8]=-1;zy[8]=1;
mali();
}
luoyuanhong2008
2004-03-17
打赏
举报
回复
大家帮看看,算法的思想和 swnuking(小楼一夜听春雨) 的差不多,不过还没经过测试.不过看上去开销不小.希望高手指点一二,能不能给一个更好的算法.
#include<stdio.h>
#define m 15
#define n 10
struct
{
int x,y;
int pre;
}sq[400];
int mg[m][n];
int zx[8],zy[8];
void print(rear)
{
int i;
i = rear;
do
{
printf("%d%d",sq[i].x,sq[i].y);
i = sq[i].pre;
}while(i!=0);
}
void malj()
{
int x,y,i,j,v,front,rear;
find=0;
front = rear =1;
sq[1].x=1;
sq[1].y=1;
sq[1].pre = 0;
mg[1][1] = -1;
while(!find&&front<rear)
{
x = sq[front].x;
y = sq[front].y;
for(v=1;v<=8;v++)
i = x+zx[i];
j = y+zy[i];
if(mg[i][j]==0)
{
rear++;
sq[rear].x=i;
sq[rear].y=j;
sq[rear].pre=front;
mg[i][j]=-1;
}
if(i==m&&j==n)
{
find=1;
print(rear);
}
front++;
}
if(!find)
printf(Can finda way!);
}
main()
{
int i ,j;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&mg[i][j]);
for(i=0;i<=m+1;i++)
mg[i][0]=mg[i][n+1]=1;
for(j=0;j<=n+1;j++)
mg[0][j]=mg[m+1][j]=1;
zx[1]=1;zy[1]=0;zx[2]=0;zy[2]=1;
zx[3]=-1;zy[3]=0;zx[4]=0;zy[4]=-1;
zx[5]=1;zy[5]=1;zx[6]=-1;zy[6]=-1;
zx[7]=1;zy[7]=-1;zx[8]=-1;zy[8]=1;
mali();
}
luoyuanhong2008
2004-03-17
打赏
举报
回复
不慢,现在看一样的.
swnuking
2004-03-15
打赏
举报
回复
晕,慢了,不就走开一会儿啊,这么多人回帖了!!郁闷ing~~~~~~!
swnuking
2004-03-15
打赏
举报
回复
为了求解便于表诉,将题目做如下变通,用-1表示不能通过。且假定只能寻找路径的时候上下左右移动。
1、初始化二维数组。
2、将元素A[15][15]置为1,然后从A[15][15]开始,判断周围有无元素为A[0][0],若无则将A[15][15]周围不为-1的元素置为2。
3、以顺时针方向或者逆时针方向依次选一个值为2的元素搜索周围值为0的元素有无元素A[0][0],若无则将周围值为0的元素置为3。
4、以第3步的方法搜索值为N的元素周围有无A[0][0],若无则将其周围值为0的元素置为N+1,并重复做第四步。若找到A[0][0],将其置为N+1,然后做第5步。
5、寻找A[0][0],周围值为N-1的元素并打印该元素的标号。
6、3、以顺时针方向或者逆时针方向选择一个值为N-1的元素以其为出发点寻找值为N-2的元素并打印,直到找到值为1的元素(即A[15][15])。
7、退出。
这样,我们就找到了一条从元素A[0][0]到A[15][15]的最短路径,类似的,我们可以找到所有从元素A[0][0]到A[15][15]的最短路径。
bideyore
2004-03-15
打赏
举报
回复
类似数据结构中的迷宫求解,是吗?
Quain
2004-03-15
打赏
举报
回复
mark一下,这个问题有点复杂,最简单的是递归算法,但是开销太大,没意思
我的想法是根据地图上障碍的多少来考虑算法,这样实际意义更为显著一些.
举个简单的例子:
A.如果地图上的障碍比较少,那么采取碰障碍绕障碍的算法快也简单
B.如果地图上障碍非常多,递归会比较好,总之没有一个即好又快的方法,看到你这个问题,我第一个想到的是游戏中的自动走路,那个应该是属于A,而迷宫则属于B,所以不敢枉自建议出一个算法 :) 关注一下,希望有高人指点二三
matlab鲸鱼优化
算法
求解
开放式车辆
路径
问题.zip
matlab鲸鱼优化
算法
求解
开放式车辆
路径
问题.zip
求解
最短
路径
的Dijkstra
算法
.doc
求解
最短
路径
的Dijkstra
算法
.doc
新型遗传模拟退火
算法
求解
物流配送
路径
问题.pdf
新型遗传模拟退火
算法
求解
物流配送
路径
问题.pdf
【
路径
规划】基于蚁群
算法
求解
最短
路径
matlab.md
【
路径
规划】基于蚁群
算法
求解
最短
路径
matlab
【
路径
规划】基于粒子群优化蚁群
算法
求解
二维最短
路径
matlab源码.zip
【
路径
规划】基于粒子群优化蚁群
算法
求解
二维最短
路径
matlab源码.zip
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章