三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 372|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo3-5.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo3-5.c 利用栈求解迷宫问题(只输出一个解,算法3.3) */
  2. typedef struct /* 迷宫坐标位置类型 */
  3. {
  4.    int x; /* 行值 */
  5.    int y; /* 列值 */
  6. }PosType;

  7. #define MAXLENGTH 25 /* 设迷宫的最大行列为25 */
  8. typedef int MazeType[MAXLENGTH][MAXLENGTH]; /* 迷宫数组[行][列] */

  9. /* 全局变量 */
  10. MazeType m; /* 迷宫数组 */
  11. int curstep=1; /* 当前足迹,初值为1 */

  12. typedef struct /* 栈的元素类型 */
  13. {
  14.    int ord; /* 通道块在路径上的"序号" */
  15.    PosType seat; /* 通道块在迷宫中的"坐标位置" */
  16.    int di; /* 从此通道块走向下一通道块的"方向"(0~3表示东~北) */
  17. }SElemType;

  18. #include"c1.h"
  19. #include"c3-1.h" /* 采用顺序栈存储结构 */
  20. #include"bo3-1.c" /* 采用顺序栈的基本操作函数 */

  21. /* 定义墙元素值为0,可通过路径为1,不能通过路径为-1,通过路径为足迹 */

  22. Status Pass(PosType b)
  23. { /* 当迷宫m的b点的序号为1(可通过路径),return OK; 否则,return ERROR。 */
  24.    if(m[b.x][b.y]==1)
  25.      return OK;
  26.    else
  27.      return ERROR;
  28. }

  29. void FootPrint(PosType a)
  30. { /* 使迷宫m的a点的序号变为足迹(curstep) */
  31.    m[a.x][a.y]=curstep;
  32. }

  33. PosType NextPos(PosType c,int di)
  34. { /* 根据当前位置及移动方向,返回下一位置 */
  35.    PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; /* {行增量,列增量} */
  36.    /* 移动方向,依次为东南西北 */
  37.    c.x+=direc[di].x;
  38.    c.y+=direc[di].y;
  39.    return c;
  40. }

  41. void MarkPrint(PosType b)
  42. { /* 使迷宫m的b点的序号变为-1(不能通过的路径) */
  43.    m[b.x][b.y]=-1;
  44. }

  45. Status MazePath(PosType start,PosType end) /* 算法3.3 */
  46. { /* 若迷宫maze中存在从入口start到出口end的通道,则求得一条 */
  47.    /* 存放在栈中(从栈底到栈顶),并返回TRUE;否则返回FALSE */
  48.    SqStack S;
  49.    PosType curpos;
  50.    SElemType e;
  51.    InitStack(&S);
  52.    curpos=start;
  53.    do
  54.    {
  55.      if(Pass(curpos))
  56.      { /* 当前位置可以通过,即是未曾走到过的通道块 */
  57.        FootPrint(curpos); /* 留下足迹 */
  58.        e.ord=curstep;
  59.        e.seat.x=curpos.x;
  60.        e.seat.y=curpos.y;
  61.        e.di=0;
  62.        Push(&S,e); /* 入栈当前位置及状态 */
  63.        curstep++; /* 足迹加1 */
  64.        if(curpos.x==end.x&&curpos.y==end.y) /* 到达终点(出口) */
  65.          return TRUE;
  66.        curpos=NextPos(curpos,e.di);
  67.      }
  68.      else
  69.      { /* 当前位置不能通过 */
  70.        if(!StackEmpty(S))
  71.        {
  72.          Pop(&S,&e); /* 退栈到前一位置 */
  73.          curstep--;
  74.          while(e.di==3&&!StackEmpty(S)) /* 前一位置处于最后一个方向(北) */
  75.          {
  76.            MarkPrint(e.seat); /* 留下不能通过的标记(-1) */
  77.            Pop(&S,&e); /* 退回一步 */
  78.            curstep--;
  79.          }
  80.          if(e.di<3) /* 没到最后一个方向(北) */
  81.          {
  82.            e.di++; /* 换下一个方向探索 */
  83.            Push(&S,e);
  84.            curstep++;
  85.            curpos=NextPos(e.seat,e.di); /* 设定当前位置是该新方向上的相邻块 */
  86.          }
  87.        }
  88.      }
  89.    }while(!StackEmpty(S));
  90.    return FALSE;
  91. }

  92. void Print(int x,int y)
  93. { /* 输出迷宫的解 */
  94.    int i,j;
  95.    for(i=0;i<x;i++)
  96.    {
  97.      for(j=0;j<y;j++)
  98.        printf("%3d",m[i][j]);
  99.      printf("\n");
  100.    }
  101. }

  102. void main()
  103. {
  104.    PosType begin,end;
  105.    int i,j,x,y,x1,y1;
  106.    printf("请输入迷宫的行数,列数(包括外墙):");
  107.    scanf("%d,%d",&x,&y);
  108.    for(i=0;i<x;i++) /* 定义周边值为0(同墙) */
  109.    {
  110.      m[0][i]=0; /* 行周边 */
  111.      m[x-1][i]=0;
  112.    }
  113.    for(j=1;j<y-1;j++)
  114.    {
  115.      m[j][0]=0; /* 列周边 */
  116.      m[j][y-1]=0;
  117.    }
  118.    for(i=1;i<x-1;i++)
  119.      for(j=1;j<y-1;j++)
  120.        m[i][j]=1; /* 定义通道初值为1 */
  121.    printf("请输入迷宫内墙单元数:");
  122.    scanf("%d",&j);
  123.    printf("请依次输入迷宫内墙每个单元的行数,列数:\n");
  124.    for(i=1;i<=j;i++)
  125.    {
  126.      scanf("%d,%d",&x1,&y1);
  127.      m[x1][y1]=0; /* 定义墙的值为0 */
  128.    }
  129.    printf("迷宫结构如下:\n");
  130.    Print(x,y);
  131.    printf("请输入起点的行数,列数:");
  132.    scanf("%d,%d",&begin.x,&begin.y);
  133.    printf("请输入终点的行数,列数:");
  134.    scanf("%d,%d",&end.x,&end.y);
  135.    if(MazePath(begin,end)) /* 求得一条通路 */
  136.    {
  137.      printf("此迷宫从入口到出口的一条路径如下:\n");
  138.      Print(x,y); /* 输出此通路 */
  139.    }
  140.    else
  141.      printf("此迷宫没有从入口到出口的路径\n");
  142. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-10-21 00:35 , Processed in 0.027808 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表