三木社区

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

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

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:25:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo3-9.c 用递归函数求解迷宫问题(求出所有解) */
  2. #include<stdio.h> /* 根据《PASCAL程序设计》(郑启华编著)中的程序改编 */
  3. struct PosType /* 迷宫坐标位置类型 */
  4. {
  5.    int x; /* 行值 */
  6.    int y; /* 列值 */
  7. };

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

  10. /* 全局变量 */
  11. struct PosType end; /* 迷宫终点位置 */
  12. MazeType m; /* 迷宫数组 */
  13. int x,y; /* 迷宫行数,列数 */

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

  15. void Print(int x,int y)
  16. { /* 输出解 */
  17.    int i,j;
  18.    for(i=0;i<x;i++)
  19.    {
  20.      for(j=0;j<y;j++)
  21.        printf("%3d",m[i][j]);
  22.      printf("\n");
  23.    }
  24.    printf("\n");
  25. }

  26. void Try(struct PosType cur,int curstep)
  27. { /* 由当前位置cur、当前步骤curstep试探下一点 */
  28.    int i;
  29.    struct PosType next; /* 下一个位置 */
  30.    struct PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; /* {行增量,列增量} */
  31.    /* 移动方向,依次为东南西北 */
  32.    for(i=0;i<=3;i++) /* 依次试探东南西北四个方向 */
  33.    {
  34.      next.x=cur.x+direc[i].x;
  35.      next.y=cur.y+direc[i].y;
  36.      if(m[next.x][next.y]==-1) /* 是通路 */
  37.      {
  38.        m[next.x][next.y]=++curstep;
  39.        if(next.x!=end.x||next.y!=end.y) /* 没到终点 */
  40.          Try(next,curstep); /* 试探下一点(递归调用) */
  41.        else
  42.          Print(x,y); /* 输出结果 */
  43.        m[next.x][next.y]=-1; /* 恢复为通路,试探下一条路 */
  44.        curstep--;
  45.      }
  46.    }
  47. }

  48. void main()
  49. {
  50.    struct PosType begin;
  51.    int i,j,x1,y1;
  52.    printf("请输入迷宫的行数,列数(包括外墙):");
  53.    scanf("%d,%d",&x,&y);
  54.    for(i=0;i<x;i++) /* 定义周边值为0(同墙) */
  55.    {
  56.      m[0][i]=0; /* 行周边 */
  57.      m[x-1][i]=0;
  58.    }
  59.    for(j=1;j<y-1;j++)
  60.    {
  61.      m[j][0]=0; /* 列周边 */
  62.      m[j][y-1]=0;
  63.    }
  64.    for(i=1;i<x-1;i++)
  65.      for(j=1;j<y-1;j++)
  66.        m[i][j]=-1; /* 定义通道初值为-1 */
  67.    printf("请输入迷宫内墙单元数:");
  68.    scanf("%d",&j);
  69.    if(j)
  70.      printf("请依次输入迷宫内墙每个单元的行数,列数:\n");
  71.    for(i=1;i<=j;i++)
  72.    {
  73.      scanf("%d,%d",&x1,&y1);
  74.      m[x1][y1]=0;
  75.    }
  76.    printf("迷宫结构如下:\n");
  77.    Print(x,y);
  78.    printf("请输入起点的行数,列数:");
  79.    scanf("%d,%d",&begin.x,&begin.y);
  80.    printf("请输入终点的行数,列数:");
  81.    scanf("%d,%d",&end.x,&end.y);
  82.    m[begin.x][begin.y]=1;
  83.    Try(begin,1); /* 由第一步起点试探起 */
  84. }
复制代码


回复

使用道具 举报

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

辽公网安备 21021702000620号

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

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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