一个4x4的方格,每个权值为MAX的方格为障碍物,给出起点start,终点end ,方格只能向上下左右四个方向移动,求出start到end的路径
该题解题思路很简单,用一个栈来保存当前路径,保证在任何位置上都能原路返回;
1.将start入栈
2.1判断栈定元素是否满足结束条件(是否为终点),满足则打印当前栈的内容,return 跳出循环
2.2是否满足退栈条件(栈定元素在栈中属于重复出现,栈定元素坐标越界,栈顶元素的di>3(已经遍历过其上下左右四个相邻元素)
2.3 满足入栈条件,则将该栈下一个相邻元素入栈(di决定)
3.重复2,直到栈为空
#define MAX 1024
#include <stdio.h>
//定义描述元素坐标的类型
typedef struct {
int x;
int y;
} PosType;
//定义方格元素类型
typedef struct
{
int value;
PosType seat;
int di;//用来标记遍历了第几个相邻元素(如bi=0,表示要遍历其第一个相邻元素(上方的元素),di=4表示四
//个相邻元素均以遍历过)
}ElemType;
void mazePath(ElemType (*maze)[4],PosType start,PosType end)
{
//初始化栈path:用数组模拟栈
PosType path[16];
int index=0;
//将end 入栈
path[index].x=start.x;
path[index].y=start.y;
//
int i,x,y,di;
do{
x=path[index].x;
y=path[index].y;
di=maze[x][y].di;
//1.正确路径,打印栈,结束
if(x==end.x && y==end.y){// 正确路径,打印栈,结束
for(i=0;i<=index;i++){
printf("(%-3d,%-3d) ",path[i].x,path[i].y);
}
printf("\n");
return ;
}
//2.退栈的情况
//2.1 当前元素为障碍物或其坐标超出范围
if(x<0||x>3||y<0||y>3 ||MAX==maze[x][y].value ||di>3){//退栈
index--;
continue;///
}
//2.2.当前元素path[index]在栈中index之前出现过,退栈
for(i=0;i<index;i++){
if(path[i].x==x && path[i].y==y){
index--;
break;
}
}
if(i!=index) continue;
//3.入栈的情况
if(i==index){ //
di= maze[x][y].di++;
switch(di){
case 0:
x--;break;
case 1:
y++;break;
case 2:
x++;break;
case 3:
y--; break;
}//switch
//入栈
index++;
path[index].x=x;
path[index].y=y;
}
}while(index >=0);
//栈为空,没有路径
printf("no path\n");
return ;
};
void main()
{
//初始化迷宫
ElemType maze[4][4];
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
maze[i][j].di=0;
maze[i][j].seat.x=i;
maze[i][j].seat.y=j;
maze[i][j].value=1;
}//for
}//for
//设置障碍物
maze[0][0].value=MAX;
maze[1][1].value=MAX;
maze[1][2].value=MAX;
maze[3][3].value=MAX;
//设置起始点
PosType start,end;
start.x=1;
start.y=0;
end.x=0;
end.y=2;
//打印出从(1,0)到(0,2)的路径
mazePath(maze,start,end);
}
结果:
root@mango:~/scripts/my_c# ./a.out
(1 ,0
) (2
,0
) (2
,1
) (2
,2
) (2
,3
) (1
,3
) (0
,3
) (0
,2
)
该题解题思路很简单,用一个栈来保存当前路径,保证在任何位置上都能原路返回;
1.将start入栈
2.1判断栈定元素是否满足结束条件(是否为终点),满足则打印当前栈的内容,return 跳出循环
2.2是否满足退栈条件(栈定元素在栈中属于重复出现,栈定元素坐标越界,栈顶元素的di>3(已经遍历过其上下左右四个相邻元素)
2.3 满足入栈条件,则将该栈下一个相邻元素入栈(di决定)
3.重复2,直到栈为空
#define MAX 1024
#include <stdio.h>
//定义描述元素坐标的类型
typedef struct {
} PosType;
//定义方格元素类型
typedef struct
}ElemType;
void mazePath(ElemType (*maze)[4],PosType start,PosType end)
{
};
void main()
{
}
结果:
root@mango:~/scripts/my_c# ./a.out
(1