AOJ-AHU-OJ-6 Hero in maze(拓展)
上次在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(拓展)相关推荐
- ACM 广搜 Hero In Maze
这是Hero In Maze三道题,分别是TOJ中Hero In Maze简单版,普通版,提高版. 以下我将一一阐述. TOJ 2777 Hero In Maze简单版 描述 500年前,Jesse是 ...
- 数据结构练习题――Hero In Maze 简单版
数据结构练习题――Hero In Maze 简单版 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:306 ...
- YTU 1006 Hero In Maze
1006: Hero In Maze Time Limit: 1000 Sec Memory Limit:64 MB Submit: 59 Solved: 16 [Submit][Status][ ...
- 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年前, ...
- 台州学院acm:1005 Hero In Maze
1005: Hero In Maze 时间限制(普通/Java):1000MS/10000MS 内存限制:65536KByte 总提交: 3881 测试通过:979 ...
- AOJ 6.Hero In Maze
简单的最短路 BFS DFS都可以实现(BFS应该会更快一点吧) 其中输入的N.M.T中,N是列,M是行,而不是和大多数题目一样,N是行,M是列 另外,类中不要乱放常量,类中不要直接为类变量赋初值(不 ...
- 【TOJ 3305】Hero In Maze II
描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫, ...
- Hero In Maze 简单版
描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫, ...
- 数据结构练习题――Hero In Maze 简单版(JSU-ZJJ)
题目描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人_. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫, ...
最新文章
- PostgreSQL 客户端乱码问题
- DjangoORM字段介绍
- 《研发企业管理——思想、方法、流程和工具》——1.7 企业研发管理的目的
- python哪个更强大_Ruby和Python哪个更强大?学习分析
- linux oracle ojdbc,Maven无法下载Oracle驱动ojdbc的解决方式
- SSM框架整合(xml配置)
- sum多个字段的值相加_Excel Sumifs函数多字段多条件求和使用实例
- PMP-5.组织结构类型
- 数据耦合的代码例子c语言,代码耦合的处理
- 树莓派存储方案_如何在树莓派上搭建私有云存储
- .o .a .lo .la
- matlab绘制站点分布图
- C++ 有关string类的基本语法以及一个简单算法 理论加案例的形式
- hihoCoder1044
- python爬取 过去的微博热搜(热搜神器)
- 学生上课睡觉班主任怎么处理_“佛系教师”语录:小孩是别人的,成绩是校长的,饭碗是自己的...
- Android Studio 获取经纬度
- 智能水浸报警器:智慧安防一站式解决,省心
- ESXi-6.7.0-20191204001-standard-RTL8111.iso集成第三方网卡驱动
- 宝藏又小众的球形物体Flash动画素材网站分享
热门文章
- 几位深受妇科病困扰的女明星
- 单词计数(WordCount)
- 干货|6个牛逼的基于Vue.js的后台控制面板,接私活必备
- Activiti7工作流引擎:基础篇(七) 流程变量
- 从1到无穷大--深度学习篇
- 2022年登高架设考试练习题及答案
- python读啥-Python之文件读写
- 翻译连载 | JavaScript轻量级函数式编程-第4章:组合函数 |《你不知道的JS》姊妹篇
- [Oracle]-[OCP]-申请纸质版OCP证书
- 软考备考----数字签名、特洛伊木马、音频信号范围、著作权法