上次在Hero in maze中我把从白书上学到的BFS分享了一下。但是白书上的《走迷宫》其实是输出走出迷宫路径的。如果想要更好地学习BFS。请看如何打印出拯救公主的路径。

代码如下:

#include <stdio.h>
#include <memory.h>
int q[900], la_dir[30][30], dir[900];//数组q[max*max]作为队列,保存当前位置 ,la_dir数组用于保存最后一次移动的方向,dir数组保存每一步的方向
int mat[30][30], vis[30][30], fa[30][30];//数组fa保存当前位置的父结点
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};//数组dx,dy保存当前位置的偏移量
int sx, sy, ox, oy, n, m;
char s[30], name[4] = {'U','R','D','L'};
void print(int x, int y){//用于打印走出迷宫最短路径,x、y初始为公主的位置int c = 0;//保存需要打印的路径个数for(;;){//对成功救出公主的路径进行探索,每一个结点查找到它的父结点int fx = fa[x][y] / m;//fx更新为其父结点位置int fy = fa[x][y] % m;if(fx == x&&fy == y)//当前结点与其父结点相等,说明到了起点break;dir[c++] = la_dir[x][y];//保存从终点到起点的路径x = fx;//x更新为当前结点的父结点y = fy;}while(c--)printf("%c->",name[dir[c]]);//逆向输出所保存的路径puts("");
}
void bfs(int x, int y){//通过BFS制作一个最短通路int fron = 0, rear = 0;//队首、队尾指针初始化int d, u;u = x * m + y;//记录起点的位置vis[x][y] = 1;//做已访问标记fa[x][y] = u;//fa保存起点位置,自己作为自己的父结点q[rear++] = u;//起点进入队列, 移动到队首,队尾指针后移while(fron < rear){//判断队列是否为空u = q[fron++];//此时u更新为当前队首位置,队首元素出列(先进先出)x = u / m;//提取当前位置的横坐标y = u % m;//提取当前位置的纵坐标for(d = 0; d < 4; d++){//上下左右四个方向各偏移一次int nx = x + dx[d], ny = y + dy[d];//下标偏移if(nx >= 0&&nx < n&&ny >= 0&&ny < m&&mat[nx][ny]&& !vis[nx][ny]){//如果偏移后结点未曾访问且可以走通,则访问此结点int v = nx * m + ny;//保存偏移位置q[rear++] = v;//偏移位置进入队尾vis[nx][ny] = 1;//做已访问标记fa[nx][ny] = u;//保存偏移位置的父结点la_dir[nx][ny] = d;//保存当前偏移方向,0:上 1:右 2:下 3:左}}}
}
int main(){int i, j;memset(mat, 0, sizeof(mat));memset(vis, 0, sizeof(vis));scanf("%d%d", &n, &m);for(i = 0; i < n; i++){scanf("%s", s);//按行输入迷宫地图for(j = 0; j < m; j++){switch(s[j]){case '*':mat[i][j] = 0;break;case '.':mat[i][j] = 1;break;case 'S':mat[i][j] = 1;sx = i;sy = j;break;case 'P':mat[i][j] = 1;ox = i;oy = j;break;}}}bfs(sx, sy);print(ox, oy);return 0;
}

AOJ-AHU-OJ-6 Hero in maze(拓展)相关推荐

  1. ACM 广搜 Hero In Maze

    这是Hero In Maze三道题,分别是TOJ中Hero In Maze简单版,普通版,提高版. 以下我将一一阐述. TOJ 2777 Hero In Maze简单版 描述 500年前,Jesse是 ...

  2. 数据结构练习题――Hero In Maze 简单版

    数据结构练习题――Hero In Maze 简单版 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:306            ...

  3. YTU 1006 Hero In Maze

    1006: Hero In Maze Time Limit: 1000 Sec  Memory Limit:64 MB Submit: 59  Solved: 16 [Submit][Status][ ...

  4. AOJ-AHU-OJ-6 Hero in Maze

    Hero In Maze Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB Description 500年前, ...

  5. 台州学院acm:1005 Hero In Maze

    1005: Hero In Maze   时间限制(普通/Java):1000MS/10000MS     内存限制:65536KByte 总提交: 3881            测试通过:979 ...

  6. AOJ 6.Hero In Maze

    简单的最短路 BFS DFS都可以实现(BFS应该会更快一点吧) 其中输入的N.M.T中,N是列,M是行,而不是和大多数题目一样,N是行,M是列 另外,类中不要乱放常量,类中不要直接为类变量赋初值(不 ...

  7. 【TOJ 3305】Hero In Maze II

    描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫, ...

  8. Hero In Maze 简单版

    描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫, ...

  9. 数据结构练习题――Hero In Maze 简单版(JSU-ZJJ)

    题目描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人_. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫, ...

最新文章

  1. PostgreSQL 客户端乱码问题
  2. DjangoORM字段介绍
  3. 《研发企业管理——思想、方法、流程和工具》——1.7 企业研发管理的目的
  4. python哪个更强大_Ruby和Python哪个更强大?学习分析
  5. linux oracle ojdbc,Maven无法下载Oracle驱动ojdbc的解决方式
  6. SSM框架整合(xml配置)
  7. sum多个字段的值相加_Excel Sumifs函数多字段多条件求和使用实例
  8. PMP-5.组织结构类型
  9. 数据耦合的代码例子c语言,代码耦合的处理
  10. 树莓派存储方案_如何在树莓派上搭建私有云存储
  11. .o .a .lo .la
  12. matlab绘制站点分布图
  13. C++ 有关string类的基本语法以及一个简单算法 理论加案例的形式
  14. hihoCoder1044
  15. python爬取 过去的微博热搜(热搜神器)
  16. 学生上课睡觉班主任怎么处理_“佛系教师”语录:小孩是别人的,成绩是校长的,饭碗是自己的...
  17. Android Studio 获取经纬度
  18. 智能水浸报警器:智慧安防一站式解决,省心
  19. ESXi-6.7.0-20191204001-standard-RTL8111.iso集成第三方网卡驱动
  20. 宝藏又小众的球形物体Flash动画素材网站分享

热门文章

  1. 几位深受妇科病困扰的女明星
  2. 单词计数(WordCount)
  3. 干货|6个牛逼的基于Vue.js的后台控制面板,接私活必备
  4. Activiti7工作流引擎:基础篇(七) 流程变量
  5. 从1到无穷大--深度学习篇
  6. 2022年登高架设考试练习题及答案
  7. python读啥-Python之文件读写
  8. 翻译连载 | JavaScript轻量级函数式编程-第4章:组合函数 |《你不知道的JS》姊妹篇
  9. [Oracle]-[OCP]-申请纸质版OCP证书
  10. 软考备考----数字签名、特洛伊木马、音频信号范围、著作权法