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

2024-03-15 11:59

本文主要是介绍第十二周项目5—— 迷宫问题之图深度优先遍历解法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


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

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

<code class="hljs mathematica has-numbering">    int mg[M+<span class="hljs-number">2</span>][<span class="hljs-keyword">N</span>+<span class="hljs-number">2</span>]=   //迷宫数组
<span class="hljs-list">{
{1,1,1,1,1,1}</span>,
<span class="hljs-list">{1,0,0,0,1,1}</span>,
<span class="hljs-list">{1,0,1,0,0,1}</span>,
<span class="hljs-list">{1,0,0,0,1,1}</span>,
<span class="hljs-list">{1,1,0,0,0,1}</span>,
<span class="hljs-list">{1,1,1,1,1,1}</span>
};</code>

建立的图结构为:

于是,从(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));   //创建一个节点*p
p->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;
}


运行结果:

这篇关于第十二周项目5—— 迷宫问题之图深度优先遍历解法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811916

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)