求一个求从迷宫的一点到另一点的最短路径的递归算法

我没有学过树之类的数据结构,书上的广搜貌似都是用树来讲解的,看不懂,麻烦大家给我粘一个通俗一点的用递归解决的算法,要完整代码,还有,必须是C或者C++的,谢谢!一定要递归... 我没有学过树之类的数据结构,书上的广搜貌似都是用树来讲解的,看不懂,麻烦大家给我粘一个通俗一点的用递归解决的算法,要完整代码,还有,必须是C或者C++的,谢谢!
一定要递归的,谢谢!
展开
 我来答
百度网友38c8e98
2011-02-17 · TA获得超过2657个赞
知道小有建树答主
回答量:1131
采纳率:0%
帮助的人:574万
展开全部
typedef struct node
{
int i;
struct node **nearby;//相邻结点可以有多个,所以这里用指针的指针
} MAPNODE;
MAPNODE a,b;
int minpath(a,b)//从a结点到b结点可以分成两步,1.从a到b的相邻结点。2.从相邻结点到b结点,这就是一个递归的过程
{
int dis=0;
int min=999999;//一个足够大的数据
MAPNODE **p;
if(a.i==b.i)//序号相同表示是同一结点,path为0
{
dis=0;
}
else
{
for(p=b.nearby;*p!=0;p++)
{
dis=0;
dis+=minpath(a,*p);
dis<min?min=dis:;
}
}
return dis;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qsavv09
2011-02-18 · TA获得超过176个赞
知道答主
回答量:119
采纳率:0%
帮助的人:0
展开全部
计算机程序设计艺术
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2052c26
2011-02-18 · 超过28用户采纳过TA的回答
知道答主
回答量:112
采纳率:0%
帮助的人:64.6万
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct pos
{
int x,y;
pos()
{
x=0;y=0;
}
void print()
{
printf("(%d,%d)\n",y+1,x+1);
}
void setxy(int a,int b)
{
x=a;
y=b;
}
}pos;

int maze[200][200];
int n,m;
int ex,ey;
int min=(int)2e30;
pos out;
pos stack[500];
pos *p=stack;

void push(int x,int y)
{
p->setxy(x,y);
p++;
}

void find(int x,int y,int num)
{
push(x,y);
if(y-1>=0&&maze[y-1][x]==num-1) find(x,y-1,num-1);
else if(y+1<n&&maze[y+1][x]==num-1) find(x,y+1,num-1);
else if(x+1<m&&maze[y][x+1]==num-1) find(x+1,y,num-1);
else if(x-1>=0&&maze[y][x-1]==num-1) find(x-1,y,num-1);
}

void set(int x,int y,int num)
{
if(maze[y][x]==-3)
{
if(num<min)
{
min=num;
out.setxy(x,y);
}
}
else
{
if(maze[y][x]>num||maze[y][x]==0)
{
maze[y][x]=num;
if(y-1>=0&&( maze[y-1][x]>num+1 || maze[y-1][x]==0 || maze[y-1][x]==-3) ) set(x,y-1,num+1);
if(y+1<n &&( maze[y+1][x]>num+1 || maze[y+1][x]==0 || maze[y+1][x]==-3) ) set(x,y+1,num+1);
if(x-1>=0&&( maze[y][x-1]>num+1 || maze[y][x-1]==0 || maze[y][x-1]==-3) ) set(x-1,y,num+1);
if(x+1<m&& ( maze[y][x+1]>num+1 || maze[y][x+1]==0 || maze[y][x+1]==-3) ) set(x+1,y,num+1);
}
}
}

int main()
{

freopen("input.txt","r",stdin);

scanf("%d%d",&n,&m);
char ch;
memset(maze,0,sizeof(maze));
scanf("\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%c",&ch);
if(ch=='#') maze[i][j]=-1;
else if(ch=='S')//入口
{
ex=j;ey=i;
}
else if(ch=='E')//出口
{
maze[i][j]=-3;
}
}
scanf("\n");
}

set(ex,ey,1);
printf("最短路径=%d步\n\n",min);
find(out.x,out.y,min);
for(int i=0;i<min;i++) stack[min-i-1].print();
return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式