求解一个搜索路径的算法.

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 打赏 收藏 转发到动态 举报
写回复
用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,所以不敢枉自建议出一个算法 :) 关注一下,希望有高人指点二三

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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