迷宫求解问题

一个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  )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值