5_8.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 5_8.c                     */
  3. /*    应用栈来走迷宫                      */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct stack_node                 /* 栈的结构宣告     */
  7. {
  8.    int x;                         /* 路径座标x          */
  9.    int y;                         /* 路径座标y          */
  10.    struct stack_node *next;       /* 指向下一节点       */
  11. };
  12. typedef struct stack_node stack_list; /* 串列新型态     */
  13. typedef stack_list *link;         /* 串列指标新型态     */
  14. link path = NULL;                 /* 路径栈指标       */
  15. /* ---------------------------------------- */
  16. /*  栈资料的存入                          */
  17. /* ---------------------------------------- */
  18. link push(link stack,int x,int y)
  19. {
  20.    link new_node;                 /* 新节黠指标         */
  21.    /* 配置节点记忆体 */
  22.    new_node = ( link ) malloc(sizeof(stack_list));
  23.    if ( !new_node )
  24.    {
  25.       printf("记忆体配置失败! n");
  26.       return NULL;                /* 存入失败           */
  27.    }
  28.    new_node->x = x;               /* 存入路径座标x      */
  29.    new_node->y = y;               /* 存入路径座标y      */
  30.    new_node->next = stack;        /* 新节点指向原开始   */
  31.    stack = new_node;              /* 新节点成为栈开始 */
  32.    return stack;
  33. }
  34. /* ---------------------------------------- */
  35. /*  栈资料的取出                          */
  36. /* ---------------------------------------- */
  37. link pop(link stack,int *x,int *y)
  38. {
  39.    link top;                      /* 指向栈顶端       */
  40.    if ( stack != NULL )
  41.    {
  42.       top = stack;                /* 指向栈顶端       */
  43.       stack = stack->next;        /* 栈指标指向下节点 */
  44.       *x = stack->x;              /* 取出路径座标x      */
  45.       *y = stack->y;              /* 取出路径座标y      */
  46.       free(top);                  /* 释回节点记忆体     */
  47.       return stack;               /* 传回栈指标       */
  48.    }
  49.    else
  50.       *x = -1;
  51. }
  52. /* ---------------------------------------- */
  53. /*  主程式: 用回溯的方法在数组迷宫找出口.   */
  54. /*  数字 0: 表示是可走的路                  */
  55. /*  数字 1: 表示是墙壁,不可走的路           */
  56. /*  数字 2: 标示是走过的路                  */
  57. /*  数字 3: 标表示是回溯的路                */
  58. /* ---------------------------------------- */
  59. void main()
  60. {
  61.    int maze[7][10] = {            /* 迷宫的数组         */
  62.             1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  63.             1, 0, 1, 0, 1, 0, 0, 0, 0, 1,
  64.             1, 0, 1, 0, 1, 0, 1, 1, 0, 1,
  65.             1, 0, 1, 0, 1, 1, 1, 0, 0, 1,
  66.             1, 0, 1, 0, 0, 0, 0, 0, 1, 1,
  67.             1, 0, 0, 0, 1, 1, 1, 0, 0, 1,
  68.             1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
  69.    int i,j;
  70.    int x = 5;                     /* 迷宫的入口座标     */
  71.    int y = 8;
  72.    while ( x != 1 || y != 1 )     /* 是否是迷宫出口     */
  73.    {
  74.       maze[x][y] = 2;             /* 标示走过的路       */
  75.       if ( maze[x-1][y] <= 0 )    /* 往上方走           */
  76.       {
  77.          x = x - 1;               /* 座标x减一          */
  78.          path = push(path,x,y);   /* 存入路径           */
  79.       }
  80.       else
  81.          if ( maze[x+1][y] <= 0 ) /* 往下方走           */
  82.          {
  83.             x = x + 1;            /* 座标x加一          */
  84.             path = push(path,x,y);     /* 存入路径      */
  85.          }
  86.          else
  87.             if ( maze[x][y-1] <= 0 )   /* 往左方走      */
  88.             {
  89.                y = y - 1;              /* 座标y减一     */
  90.                path = push(path,x,y);  /* 存入路径      */
  91.             }
  92.             else
  93.                if ( maze[x][y+1] <= 0 )  /* 往右方走    */
  94.                {
  95.                   y = y + 1;             /* 座标y加一   */
  96.                   path = push(path,x,y); /* 存入路径    */
  97.                }
  98.                else               /* 没有路可走:回溯    */
  99.                {
  100.                   maze[x][y] = 3; /* 表示回溯的路       */
  101.                   path = pop(path,&x,&y); /* 退回一步   */
  102.                }
  103.    }
  104.    maze[x][y] = 2;                /* 标示最后一点       */
  105.    printf("迷宫的路径如下图所示:n");
  106.    for ( i = 1; i < 6; i++)       /* 印出迷宫的图形     */
  107.    {
  108.       for ( j = 1; j < 9; j++)
  109.          printf("%d",maze[i][j]); /* 印出各座标         */
  110.       printf("n");               /* 换行               */
  111.    }
  112. }