问题:

/*
* Copyright(c)2015,烟台大学计算机学院
* All right reserved.
* 文件名称:项目5.cbp
* 作者:李艺
* 完成日期;2015年11月20日
* 版本号;v1.0
* 问题描述: 设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。  (1)建立迷宫对应的图数据结构,并建立其邻接表表示。  (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径。 * 输入描述:迷宫的邻接矩阵
* 程序输出:邻接表表示迷宫,走出迷宫所有的路径
*/  

代码:

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define M 8
#define N 8
//以下定义邻接表类型
typedef struct ANode            //边的结点结构类型
{int i,j;                    //该边的终点位置(i,j)struct ANode *nextarc;      //指向下一条边的指针
} ArcNode;typedef struct Vnode            //邻接表头结点的类型
{ArcNode *firstarc;          //指向第一条边
} VNode;typedef struct
{VNode adjlist[M+2][N+2];    //邻接表头节点数组
} ALGraph;                      //图的邻接表类型typedef struct
{int i;                      //当前方块的行号int j;                      //当前方块的列号
} Box;typedef struct
{Box data[MaxSize];int length;                 //路径长度
} PathType;                     //定义路径类型int visited[M+2][N+2]= {0};
int count=0;
void CreateList(ALGraph *&G,int mg[][N+2])
//建立迷宫数组对应的邻接表G
{int i,j,i1,j1,di;ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0; i<M+2; i++)                   //给邻接表中所有头节点的指针域置初值for (j=0; j<N+2; j++)G->adjlist[i][j].firstarc=NULL;for (i=1; i<=M; i++)                    //检查mg中每个元素for (j=1; j<=N; j++)if (mg[i][j]==0){di=0;while (di<4){switch(di){case 0:i1=i-1;j1=j;break;case 1:i1=i;j1=j+1;break;case 2:i1=i+1;j1=j;break;case 3:i1=i, j1=j-1;break;}if (mg[i1][j1]==0)                          //(i1,j1)为可走方块{p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*pp->i=i1;p->j=j1;p->nextarc=G->adjlist[i][j].firstarc;   //将*p节点链到链表后G->adjlist[i][j].firstarc=p;}di++;}}
}
//输出邻接表G
void DispAdj(ALGraph *G)
{int i,j;ArcNode *p;for (i=0; i<M+2; i++)for (j=0; j<N+2; j++){printf("  [%d,%d]: ",i,j);p=G->adjlist[i][j].firstarc;while (p!=NULL){printf("(%d,%d)  ",p->i,p->j);p=p->nextarc;}printf("\n");}
}
void FindPath(ALGraph *G,int xi,int yi,int xe,int ye,PathType path)
{ArcNode *p;visited[xi][yi]=1;                   //置已访问标记path.data[path.length].i=xi;path.data[path.length].j=yi;path.length++;if (xi==xe && yi==ye){printf("  迷宫路径%d: ",++count);for (int k=0; k<path.length; k++)printf("(%d,%d) ",path.data[k].i,path.data[k].j);printf("\n");}p=G->adjlist[xi][yi].firstarc;  //p指向顶点v的第一条边顶点while (p!=NULL){if (visited[p->i][p->j]==0) //若(p->i,p->j)方块未访问,递归访问它FindPath(G,p->i,p->j,xe,ye,path);p=p->nextarc;               //p指向顶点v的下一条边顶点}visited[xi][yi]=0;
}int main()
{ALGraph *G;int mg[M+2][N+2]=                           //迷宫数组{{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,2,0,0,1},{1,0,1,1,0,1,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1},};CreateList(G,mg);printf("迷宫对应的邻接表:\n");DispAdj(G); //输出邻接表PathType path;path.length=0;printf("所有的迷宫路径:\n");FindPath(G,1,1,M,N,path);return 0;
}

部分运行结果:

知识点总结:

图的应用。

第十二周项目5-迷宫问题之图深度优先遍历解法相关推荐

  1. 第十二周项目五-----迷宫问题之图深度优先遍历解法

     烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年12月15日 问题描述:[项目 - 迷宫问题之图深度优先遍历解法]   设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题.   ( ...

  2. 第11周【项目5 - 迷宫问题之图深度优先遍历解法】

    /**Copyright(c)2017,烟台大学计算机学院*All right reserved.*文件名称:20171207.cpp*作者:李小同*完成日期:2017年12月07日*版本号:v1.1 ...

  3. 第十二周项目4-利用遍历思想求解图问题(6-7)

    /* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第十二周项目4-利用遍历思想求解图问题(6-7) 作 者:佟兴锋 完成日期: ...

  4. 第十二周项目4-点、圆的关系

    (1)先建立一个Point(点)类,包含数据成员x,y(坐标点): (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心: (3)编写上述两类中的构造.析 ...

  5. 第十二周项目二-Time类中的运算符重载

    /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年5月24日*版 本 号:v1. ...

  6. 第十二周项目一-实现复数类中的运算符重载(3)

    /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年5月15日*版 本 号:v1. ...

  7. 第十二周项目一----图基本算法库

    /*烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年11月13日 问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试. 输入描述:无 输出描述:若干数据 */ 头文件: ...

  8. 第十二周项目二----操作用邻接表存储的图

    /*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大的 ...

  9. 第十二周项目1-阅读程序(三)

    含有递归函数的程序 /**Copyright (c) 2014,烟台大学计算机学院*All gight reserved.*文件名称:temp.cpp*作者:邵帅*完成时间:2014年11月13日*版 ...

最新文章

  1. 寻找MEET大会直播中奖的小伙伴,你有红包待领取~
  2. CSS3:linear-gradient,线性渐变的使用方法
  3. ajax 上传读取excel
  4. [css] 举例说明你知道的css技巧有哪些?
  5. 【java】java 扩展可回调的Future
  6. k8s升级,HA集群1.12.0~HA集群1.13.2
  7. 迅捷cad_迅捷功能
  8. 分布式系统可观测性之应用业务指标监控
  9. 蜀门 - 青城加点完美攻略
  10. SQL点滴25—T-SQL面试语句,练练手
  11. 一个链表L 一个链表P 包含升序排列的整数 操作PrintLots(L,P)将打印L中那些由P所指定的位置上的元素
  12. Nacos如何实现统一配置管理
  13. springbooot学习记录
  14. 【分享】PPT--你不知道的使用技巧
  15. 北京烤鸭+腊肉炒花菜+香椿炒蛋
  16. 牛刀:中国房价的买点还没有…
  17. 计算机色彩再现原理,清华大学出版社-图书详情-《计算机色彩原理及应用》
  18. 迈向更灵活,贝壳 OLAP 平台架构演进历程
  19. 使用J-FLASH烧写stm32F407
  20. 使用scrapy爬虫框架来获取腾讯的招聘信息

热门文章

  1. Android 内外边距
  2. stm32f103c8t6数据手册
  3. simulink半桥逆变电路仿真
  4. 一致性哈希算法 mysql_一致性哈希算法 CARP 原理解析, 附 Golang 实现
  5. face++旷世科技实习生面试
  6. java实现牛牛游戏源代码
  7. 深度解密阿里达摩院:如何让科技与商业共舞
  8. Python--发送邮件和钉钉消息
  9. 保险丝的作用原理及选择
  10. C基础(三)函数的使用