• 数据结构-栈的实现之迷宫解密


    迷宫求解核心思想:从入口出发,顺一个方向向前探索,走得通就继续向前走;否则沿原路退回并换一个方向继续探索,直到所有的路都走完为止。

    还是用栈的先进后出的结构保存一路的路线。代码用到了之前写的栈的顺序实现数组格式那个结构。

    并且修改和增加了些与迷宫有关的结构体,如下:

     1 #define MAZESIZE 10        //测试迷宫大小为10*10大小
     2 
     3 //坐标结构
     4 typedef struct
     5 {
     6     int r;    //横坐标
     7     int c;    //纵坐标
     8 }PosType;
     9 
    10 //栈基本存储结构
    11 typedef struct
    12 {
    13     int ord;        //通道快在道路上的序号
    14     PosType seat;    //通道快所在的坐标位置
    15     int di;            //走向下一个通道快的方向
    16 }SElemType;
    17 
    18 //栈结构
    19 typedef struct
    20 {
    21     SElemType data[MAXSIZE];    //存储数组
    22     int top;                    //栈顶
    23 }Stack;
    24 
    25 //迷宫结构
    26 typedef struct
    27 {
    28     char arr[MAZESIZE][MAZESIZE];
    29 }MazeType;

    迷宫解密核心代码:

     1 #include "Stack.h"
     2 
     3 //判断当前块是否可通过
     4 Status Pass( MazeType MyMaze,PosType CurPos) 
     5 {
     6     if (MyMaze.arr[CurPos.r][CurPos.c] == ' ')
     7         return 1;     // 如果当前位置是可以通过,返回1
     8     else 
     9         return 0;  // 其它情况返回0
    10 }
    11 
    12 //下一个位置
    13 PosType NextPos(PosType CurPos, int Dir) 
    14 {
    15     PosType ReturnPos; 
    16     switch (Dir) 
    17     {
    18     case 1:
    19         ReturnPos.r = CurPos.r;
    20         ReturnPos.c = CurPos.c+1;
    21         break;
    22     case 2:
    23         ReturnPos.r = CurPos.r+1;
    24         ReturnPos.c = CurPos.c;
    25         break;
    26     case 3:
    27         ReturnPos.r = CurPos.r;
    28         ReturnPos.c = CurPos.c-1;
    29         break;
    30     case 4:
    31         ReturnPos.r = CurPos.r-1;
    32         ReturnPos.c = CurPos.c;
    33         break;
    34     }
    35     return ReturnPos;
    36 }
    37 
    38 //迷宫解密函数
    39 Status MazePath(MazeType &maze, PosType start, PosType end)
    40 {
    41     Stack S;        //路径的存储栈
    42     PosType curpos;    //当前位置坐标
    43     int curstep;    //探索步骤
    44     SElemType e;    //当前坐标块
    45     
    46     InitStack(S);    //初始化栈
    47     curpos = start;  //初始当前位置为入口
    48     curstep = 1;
    49     do 
    50     {
    51         if (Pass(maze,curpos))    //当前位置可通过,即是未曾走到过的坐标
    52         {  
    53             maze.arr[curpos.r][curpos.c] = '*'; //留下足迹
    54             e.di = 1;
    55             e.ord = curstep;
    56             e.seat = curpos;
    57             Push(S,e);              //加入路径
    58             if (curpos.r == end.r && curpos.c == end.c)   //到达终点(出口)
    59                 return OK;       
    60             curpos = NextPos(curpos, 1);        // 下一位置是当前位置的东邻
    61             curstep++;                          // 探索下一步
    62         }
    63         else    // 当前位置不能通过
    64         { 
    65             if (!StackEmpty(S)) 
    66             {
    67                 Pop(S,e);
    68                 while (e.di == 4 && !StackEmpty(S)) 
    69                 {
    70                     maze.arr[e.seat.r][e.seat.c] = '!';
    71                     Pop(S,e);    // 留下不能通过的标记,并退回一步
    72                 }
    73                 if (e.di < 4)
    74                 {
    75                     e.di++;
    76                     Push(S, e);  // 换下一个方向探索
    77                     curpos = NextPos(e.seat, e.di); // 当前位置设为新方向的相邻块
    78                 }
    79             }
    80         } 
    81     } while (!StackEmpty(S) );
    82     return ERROR;
    83 }

    做了三个迷宫的测试:其中迷宫中#代表墙不通过空的位置就是通道。最后输出的迷宫是解密之后的迷宫,通道里的!代表当前位置不通;*代表正确的路径。

      1 /*初始化迷宫*/
      2 void InitMaze1(MazeType &maze)
      3 {
      4     maze.arr[0][0]=maze.arr[0][1]=maze.arr[0][2]=maze.arr[0][3]=maze.arr[0][4]=maze.arr[0][5]=maze.arr[0][6]=maze.arr[0][7]=maze.arr[0][8]=maze.arr[0][9]= '#';
      5     maze.arr[1][0]=maze.arr[1][3]=maze.arr[1][7]=maze.arr[1][9]= '#';
      6     maze.arr[1][1]=maze.arr[1][2]=maze.arr[1][4]=maze.arr[1][5]=maze.arr[1][6]=maze.arr[1][8]= ' ';
      7     maze.arr[2][0]=maze.arr[2][3]=maze.arr[2][7]=maze.arr[2][9]= '#';
      8     maze.arr[2][1]=maze.arr[2][2]=maze.arr[2][4]=maze.arr[2][5]=maze.arr[2][6]=maze.arr[2][8]= ' ';
      9     maze.arr[3][0]=maze.arr[3][5]=maze.arr[3][6]=maze.arr[3][9]= '#';
     10     maze.arr[3][1]=maze.arr[3][2]=maze.arr[3][3]=maze.arr[3][4]=maze.arr[3][7]=maze.arr[3][8]= ' ';
     11     maze.arr[4][0]=maze.arr[4][2]=maze.arr[4][3]=maze.arr[4][4]=maze.arr[4][9]= '#';
     12     maze.arr[4][1]=maze.arr[4][5]=maze.arr[4][6]=maze.arr[4][7]=maze.arr[4][8]= ' ';
     13     maze.arr[5][0]=maze.arr[5][4]=maze.arr[5][9]= '#';
     14     maze.arr[5][1]=maze.arr[5][2]=maze.arr[5][3]=maze.arr[5][5]=maze.arr[5][6]=maze.arr[5][7]=maze.arr[5][8]= ' ';
     15     maze.arr[6][0]=maze.arr[6][2]=maze.arr[6][6]=maze.arr[6][9]= '#';
     16     maze.arr[6][1]=maze.arr[6][3]=maze.arr[6][4]=maze.arr[6][5]=maze.arr[6][7]=maze.arr[6][8]= ' ';
     17     maze.arr[7][0]=maze.arr[7][2]=maze.arr[7][3]=maze.arr[7][4]=maze.arr[7][6]=maze.arr[7][9]= '#';
     18     maze.arr[7][1]=maze.arr[7][5]=maze.arr[7][7]=maze.arr[7][8]= ' ';
     19     maze.arr[8][0]=maze.arr[8][1]=maze.arr[8][9]= '#';
     20     maze.arr[8][2]=maze.arr[8][3]=maze.arr[8][4]=maze.arr[8][5]=maze.arr[8][6]=maze.arr[8][7]=maze.arr[8][8]= ' ';
     21     maze.arr[9][0]=maze.arr[9][1]=maze.arr[9][2]=maze.arr[9][3]=maze.arr[9][4]=maze.arr[9][5]=maze.arr[9][6]=maze.arr[9][7]=maze.arr[9][8]=maze.arr[9][9]= '#';
     22 }
     23 
     24 void InitMaze2(MazeType &maze)
     25 {
     26     maze.arr[0][0]=maze.arr[0][1]=maze.arr[0][2]=maze.arr[0][3]=maze.arr[0][4]=maze.arr[0][5]=maze.arr[0][6]=maze.arr[0][7]=maze.arr[0][8]=maze.arr[0][9]= '#';
     27     maze.arr[1][0]=maze.arr[1][2]=maze.arr[1][9]= '#';
     28     maze.arr[1][1]=maze.arr[1][3]=maze.arr[1][4]=maze.arr[1][5]=maze.arr[1][6]=maze.arr[1][7]=maze.arr[1][8]= ' ';
     29     maze.arr[2][0]=maze.arr[2][2]=maze.arr[2][6]=maze.arr[2][7]=maze.arr[2][8]=maze.arr[2][9]= '#';
     30     maze.arr[2][1]=maze.arr[2][3]=maze.arr[2][4]=maze.arr[2][5]= ' ';
     31     maze.arr[3][0]=maze.arr[3][2]=maze.arr[3][6]=maze.arr[3][9]= '#';
     32     maze.arr[3][1]=maze.arr[3][3]=maze.arr[3][4]=maze.arr[3][5]=maze.arr[3][7]=maze.arr[3][8]= ' ';
     33     maze.arr[4][0]=maze.arr[4][2]=maze.arr[4][3]=maze.arr[4][4]=maze.arr[4][6]=maze.arr[4][9]= '#';
     34     maze.arr[4][1]=maze.arr[4][5]=maze.arr[4][7]=maze.arr[4][8]= ' ';
     35     maze.arr[5][0]=maze.arr[5][4]=maze.arr[5][6]=maze.arr[5][9]= '#';
     36     maze.arr[5][1]=maze.arr[5][2]=maze.arr[5][3]=maze.arr[5][5]=maze.arr[5][7]=maze.arr[5][8]= ' ';
     37     maze.arr[6][0]=maze.arr[6][2]=maze.arr[6][4]=maze.arr[6][9]= '#';
     38     maze.arr[6][1]=maze.arr[6][3]=maze.arr[6][5]=maze.arr[6][6]=maze.arr[6][7]=maze.arr[6][8]= ' ';
     39     maze.arr[7][0]=maze.arr[7][2]=maze.arr[7][7]=maze.arr[7][8]=maze.arr[7][9]= '#';
     40     maze.arr[7][1]=maze.arr[7][3]=maze.arr[7][4]=maze.arr[7][5]=maze.arr[7][6]= ' ';
     41     maze.arr[8][0]=maze.arr[8][2]=maze.arr[8][7]=maze.arr[8][9]= '#';
     42     maze.arr[8][1]=maze.arr[8][3]=maze.arr[8][4]=maze.arr[8][5]=maze.arr[8][6]=maze.arr[8][8]= ' ';
     43     maze.arr[9][0]=maze.arr[9][1]=maze.arr[9][2]=maze.arr[9][3]=maze.arr[9][4]=maze.arr[9][5]=maze.arr[9][6]=maze.arr[9][7]=maze.arr[9][8]=maze.arr[9][9]= '#';
     44 }
     45 
     46 void InitMaze3(MazeType &maze)
     47 {
     48     maze.arr[0][0]=maze.arr[0][1]=maze.arr[0][2]=maze.arr[0][3]=maze.arr[0][4]=maze.arr[0][5]=maze.arr[0][6]=maze.arr[0][7]=maze.arr[0][8]=maze.arr[0][9]= '#';
     49     maze.arr[1][0]=maze.arr[1][2]=maze.arr[1][9]= '#';
     50     maze.arr[1][1]=maze.arr[1][3]=maze.arr[1][4]=maze.arr[1][5]=maze.arr[1][6]=maze.arr[1][7]=maze.arr[1][8]= ' ';
     51     maze.arr[2][0]=maze.arr[2][2]=maze.arr[2][6]=maze.arr[2][7]=maze.arr[2][8]=maze.arr[2][9]= '#';
     52     maze.arr[2][1]=maze.arr[2][3]=maze.arr[2][4]=maze.arr[2][5]= ' ';
     53     maze.arr[3][0]=maze.arr[3][2]=maze.arr[3][6]=maze.arr[3][9]= '#';
     54     maze.arr[3][1]=maze.arr[3][3]=maze.arr[3][4]=maze.arr[3][5]=maze.arr[3][7]=maze.arr[3][8]= ' ';
     55     maze.arr[4][0]=maze.arr[4][2]=maze.arr[4][3]=maze.arr[4][4]=maze.arr[4][6]=maze.arr[4][9]= '#';
     56     maze.arr[4][1]=maze.arr[4][5]=maze.arr[4][7]=maze.arr[4][8]= ' ';
     57     maze.arr[5][0]=maze.arr[5][4]=maze.arr[5][6]=maze.arr[5][9]= '#';
     58     maze.arr[5][1]=maze.arr[5][2]=maze.arr[5][3]=maze.arr[5][5]=maze.arr[5][7]=maze.arr[5][8]= ' ';
     59     maze.arr[6][0]=maze.arr[6][2]=maze.arr[6][4]=maze.arr[6][9]= '#';
     60     maze.arr[6][1]=maze.arr[6][3]=maze.arr[6][5]=maze.arr[6][6]=maze.arr[6][7]=maze.arr[6][8]= ' ';
     61     maze.arr[7][0]=maze.arr[7][2]=maze.arr[7][7]=maze.arr[7][9]= '#';
     62     maze.arr[7][1]=maze.arr[7][3]=maze.arr[7][4]=maze.arr[7][5]=maze.arr[7][6]=maze.arr[7][8]= ' ';
     63     maze.arr[8][0]=maze.arr[8][2]=maze.arr[8][7]=maze.arr[8][9]= '#';
     64     maze.arr[8][1]=maze.arr[8][3]=maze.arr[8][4]=maze.arr[8][5]=maze.arr[8][6]=maze.arr[8][8]= ' ';
     65     maze.arr[9][0]=maze.arr[9][1]=maze.arr[9][2]=maze.arr[9][3]=maze.arr[9][4]=maze.arr[9][5]=maze.arr[9][6]=maze.arr[9][7]=maze.arr[9][8]=maze.arr[9][9]= '#';
     66 }
     67 
     68 void main()
     69 {
     70     MazeType maze;
     71     InitMaze1(maze);
     72     MazeType maze2;
     73     InitMaze2(maze2);
     74     MazeType maze3;
     75     InitMaze3(maze3);
     76     PosType s,e;
     77     s.c = s.r = 1;
     78     e.c = e.r = 8;
     79     if(MazePath(maze,s,e))
     80         printf("迷宫成功解密!
    ");
     81     else
     82         printf("解密失败
    ");
     83     for (int i = 0; i < 10; i++)
     84     {
     85         for (int j = 0; j < 10; j++)
     86         {
     87             printf("%c ",maze.arr[i][j]);
     88         }
     89         printf("
    ");
     90     }
     91     if(MazePath(maze2,s,e))
     92         printf("迷宫成功解密!
    ");
     93     else
     94         printf("解密失败
    ");
     95     for (int i = 0; i < 10; i++)
     96     {
     97         for (int j = 0; j < 10; j++)
     98         {
     99             printf("%c ",maze2.arr[i][j]);
    100         }
    101         printf("
    ");
    102     }
    103     if(MazePath(maze3,s,e))
    104         printf("迷宫成功解密!
    ");
    105     else
    106         printf("解密失败
    ");
    107     for (int i = 0; i < 10; i++)
    108     {
    109         for (int j = 0; j < 10; j++)
    110         {
    111             printf("%c ",maze3.arr[i][j]);
    112         }
    113         printf("
    ");
    114     }
    115 }

    参考《数据结构(C语言版)》严蔚敏著

  • 相关阅读:
    Vue学习笔记-基本语法
    Vue学习笔记-使用ElementUI
    Vue学习笔记-目录结构
    Arcgis api for javascript学习笔记(3.2版本)
    _countof
    自启动在UAC开启状态下解决方案
    windows常见启动项启动顺序
    ssh登录的一个小问题
    centos5.5 环境变量设置
    avalon2 第一个demo
  • 原文地址:https://www.cnblogs.com/ABook/p/5424337.html
Copyright © 2020-2023  润新知