烟台大学计算机与控制工程学院
作者:孙潇
时间:2015年12月15日
问题描述:【项目 - 迷宫问题之图深度优先遍历解法】
   设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。
   (1)建立迷宫对应的图数据结构,并建立其邻接表表示。
   (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径。

[模型建立]
  将迷宫中的每一格作为一个顶点,相邻格子可以到达,则对应的顶点之间存在边相连。

例如,下面的迷宫

在使用数组表示时,用0表示格子是空地,用1表示格子处是墙,对应的矩阵是:

于是,从(1,1)到(4,4)的迷宫问题,转化为寻找顶点(1,1)到顶点(4,4)的路径的问题。

.输入描述:
输出描述:若干数据

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define M 4
#define N 4
//以下定义邻接表类型
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,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,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;
}

运行结果:

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

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

    问题: /* * Copyright(c)2015,烟台大学计算机学院 * All right reserved. * 文件名称:项目5.cbp * 作者:李艺 * 完成日期:2015年11月20日 ...

  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. argv[1] 路径问题
  2. 【php】使用gdb调试php程序
  3. IntelliJ IDEA母公司JetBrains遭美国调查,其是美国被大规模黑客攻击的源头?
  4. 图解TCP 的重传、滑动窗口、流量控制和拥塞控制机制
  5. 深入Istio架构和功能--理解数据面/控制面/流量管理/安全/可观察性
  6. Photoshop CC 2019多边形形的抠图
  7. 百度缺的不是狼性,而是鲁滨逊
  8. 视频教程-172集通俗易懂的C语言从入门到项目实战教程-C/C++
  9. 周志华《机器学习》课后习题(第六章):支持向量机
  10. ideapad linux s9_联想IdeaPad S9 电源管理驱动
  11. Sophix介绍与实践
  12. 细思恐极 天价房都被谁买去了?——如何操作?
  13. 补阳气吃什么 补阳气的食物
  14. 文档透明加密底层安全机制
  15. Android图片轮播控件
  16. 大数据揭秘| 《少年的你》大火之后,流量明星对电影意味着什么?
  17. 洛谷 P2071 座位安排 (最大流 + 建图)
  18. pipeline(管道)设计模式
  19. windows安装pgsql exe后开启服务sql shell(psql)登录
  20. 漫画统计学(统计基础+SPSS)

热门文章

  1. 解决ERROR: Cannot uninstall ‘llvmlite‘. It is a distutils installed project and thus we cannot accurat
  2. 服务器支持安装显卡吗,如何在2U服务器里装显卡
  3. 【高速PCB电路设计】5.布局要点
  4. 做时间的朋友,必须知道收益咋算
  5. CCRC信息安全服务资质。
  6. 蔡康永般“好好说话”?百度发起猛攻 推249元小度音箱
  7. 做一个人脸识别相关的毕业设计
  8. php+xls加密,POI Excel xlsx加密
  9. 《真三国无双5》全人研究完整版
  10. 计算机图形学流体仿真mac网格,数据驱动的快速网格法流体模拟