试题集—— 算法提高 学霸的迷宫

题目:

问题描述学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式第一行两个整数n, m,为迷宫的长宽。接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
输出格式第一行一个数为需要的最少步数K。第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
样例输入
Input Sample 1:
3 3
001
100
110Input Sample 2:
3 3
000
000
000
样例输出
Output Sample 1:
4
RDRDOutput Sample 2:
4
DDRR
数据规模和约定有20%的数据满足:1<=n,m<=10有50%的数据满足:1<=n,m<=50有100%的数据满足:1<=n,m<=500。


 

解题思路:

这个题是典型的BFS路径问题,通过BFS即可获得最短路径长度,再通过寻找父节点的方式,获得路径。

#include <stdio.h>struct node{int x;int y;int s;int d;int p;
}; int main(){char map[501][501], path[2500] = "";//此处为了方便设定了一个固定值,如果想节约内存空间,可以动态增加 int book[501][501] = {0};int n, m, head = 1, tail = 1, flag = 0;struct node que[2501];int next[4][3] = {{-1, 0, 'U'},//上U {1, 0, 'D'},//下D{0, -1, 'L'},//左L{0, 1, 'R'}//右R};int i, j,tx, ty;scanf("%d %d", &n, &m);for(i = 0; i < n; i++){scanf("%s", map[i]);}que[tail].x = 1;que[tail].y = 1;que[tail].s = 0;que[tail].p = 0;tail++;book[1][1] = 1;while(head < tail){if(flag){break;}for(i = 0; i < 4; i++){tx = que[head].x + next[i][0];ty = que[head].y + next[i][1];if(tx < 1 || ty < 1 || tx > n || ty > m){continue;}			if(book[tx][ty] == 0 && map[tx - 1][ty - 1] == '0'){book[tx][ty] = 1;que[tail].x = tx;que[tail].y = ty;que[tail].s = que[head].s + 1;que[tail].d = next[i][2];que[tail].p = head;				tail++;					}if(tx == n && ty == m){flag = 1;break;}}head++;}i = tail - 1;j = 0;while(que[i].p != 0){path[j++] = que[i].d;i = que[i].p;}//输出结果 printf("%d\n", que[tail - 1].s);for(j--; j >= 0; j--){printf("%c", path[j]);}return 0;
}

在此感谢“T.H”,提供的测试数据。


博客名称:王乐平博客
博客地址:http://blog.lepingde.com
CSDN博客地址:http://blog.csdn.net/lecepin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kerberos 主从安装

hadoop 安全应用kerberos &#xff0c;搭建KDC使其高可用操作系统 ubuntu 12.04 Kerberos Server ##################### 规范介绍 #######################################Realm: BJPUC1.COM --> 建议大写Primary KDC: nn1.bjpuc1.com --> 建议用域名 192.168.88.16Se…

Android手机调整/data分区和/sdcard分区

现在手上有一块E160K的手机&#xff0c;手机内存是32GB的&#xff0c;由于之前对这个手机刷机不当&#xff0c;造成用户分区20GB多&#xff0c;而内置SD仅仅只有5GB多&#xff0c;造成了严重的资源浪费&#xff0c;所以我需要把这两个分区的大小调整一下。 问题分析&#xff1a…

自定义的事件管理器

自定义的事件管理器 周银辉 大多数框架下都提供了事件管理器的&#xff0c;但不使用框架时为了让事件发送者和事件接收者之间解耦&#xff0c;就可以如下写个简单的 public enum EventAdministratorEventTypes{ApplicationStartup, //在这里添加你需要的事件}public class Even…

高级堆排序

今天在一个OJ上做了一个叫“Advanced Heap Sort”的题&#xff0c;题的解决算法没什么难的&#xff0c;但是对时间复杂度有要求&#xff0c;用正常的算法实现&#xff0c;都会超时&#xff0c;所以我就把这个题拿过来分享一下。 问题&#xff1a; 题目内容&#xff1a; 有两个序…

可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK...

LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能。软件开发人员可以使用Video Streaming Module SDK&#xff0c;通过一些不同的配置来创建一些客户端/服务器应用程序。例如&#xff0c;如果有一个服务器需要向多个客户端发…

Joseph Problem(解约瑟夫问题)

今天在一个OJ上做了一个Joseph Problem&#xff08;解约瑟夫问题&#xff09;的题&#xff0c;题目不难&#xff0c;直接用循环链表模拟实际操作即可完成&#xff0c;但是用此种方法的时间太长&#xff0c;超时&#xff0c;所以我就用了一个大家对这类问题比较常用的解法——数…

linux下mono的安装与卸载

我很遗憾的告诉你&#xff0c;这里没有安装&#xff0c;为什么标题里加入安装俩字呢&#xff0c;因为如果不加的话你会搜到这篇文章吗&#xff1f;哈哈&#xff01;别气馁&#xff0c;这里会给你些安装的tips&#xff01; 源码安装&#xff0c;git安装&#xff1a;建议安装路径…

繁体简体转换器 v 1.0

软件截图 软件说明 软件名称&#xff1a;繁体简体转换器 软件版本&#xff1a; 1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;本软件主要是用于繁体中文转换为简体中文的工具&#xff0c;如果你想把转换后的文本用于MarkDown中&#xff0c;可以勾选“HTML转义”复选…

C#实现Combobox自动匹配字符

不多说了,如图,应客户要求,下拉框中需要自动匹配字符,可能有些人一早就对此很熟,但相对于我还是首次使用,还是花了一点时间,现记录下来,也希望能帮助大家更好的理解. 首先要设定Combobox的DropDownStyle属性为DropDown,而不是DropDownList.然后设定匹配数据源,有两种方法 第一种…

按键 使用WinHttp实现POST方式用户模拟登录网站

引言 这篇文章是我以前在一个论坛里写的&#xff0c;今天把这篇文章转移到这里。 文章主要介绍了如何模拟一个网站的登录。 这里使用的辅助工具是按键精灵&#xff0c;编程语言类似于VB。 实现步骤 第一步&#xff0c;获取登录地址 打开登录界面&#xff1a; 打开调试工…

华硕 RT-AC54U路由器固件功能说明

引言 华硕 RT-AC54U这款路由器固件&#xff0c;界面做的很不错&#xff08;起码比OpenWrt要好看&#xff09;&#xff0c;功能也比较强悍&#xff0c;但是对于刚入手这个固件的用户可能会对此固件的一些很好用的功能无从下手&#xff0c;所以这里我就写下了这个文章。 固件亮…

HTML5中类jQuery选择器querySelector的使用

为什么80%的码农都做不了架构师&#xff1f;>>> 简介 HTML5向Web API新引入了document.querySelector以及document.querySelectorAll两个方法用来更方便地从DOM选取元素&#xff0c;功能类似于jQuery的选择器。这使得在编写原生JavaScript代码时方便了许多。 用法 …

Find the Kth number(找第K大数)

题目再现 题目内容&#xff1a; 给定N个排序好的序列&#xff0c;每个序列内有M个数字。因此我们总共有N*M个数字&#xff0c;编号为1~N*M。 将N*M个数字排序后输出第K个数字是多少。Hint : 直接将N*M个数字做排序会超过时间限制。 Hint : 每次花O(N)的时间找一个数字&#xf…

[Android开源项目] GitHub开源项目总结 (转)

[Android开源项目] GitHub开源项目总结 GitHub开源项目android-styled-dialogshttp://neast.cn/forum.php?modviewthread&tid5376&fromuid5GitHub开源项目之changeloghttp://neast.cn/forum.php?modviewthread&tid5375&fromuid5GitHub开源项目之AppRaterhtt…

Species Tree(HashTable实现)

题目再现 题目内容&#xff1a; 给定一个物种演化图&#xff0c; 关系的表示方式如下&#xff1a; x y : 表示x为y的先祖。 一个物种只会有一个先祖&#xff0c; 一个先祖可以有很多个演化出来的物种&#xff0c; 请你找出每个问题询问物种的祖父物种(先祖的先祖)&#xff0c;…

苹果自己设计芯片,但是还是绕不过高通

苹果自己设计芯片&#xff0c;但是还是绕不过高通&#xff0c;目前高通是苹果的基带芯片供应商。不过基带芯片是指什么&#xff1f;苹果为何难以放弃高通芯片&#xff1f;最初苹果基带芯片供应商是博通公司&#xff0c;2011年初发布的CDMA版iPhone 4开始采用高通的基带芯片&…

Adjacent Node Sum(邻接表处理)

题目再现 题目内容&#xff1a; 给定一个节点有权重的图&#xff0c; 请你计算与一个节点相邻的所有节点的权重和。 节点编号为1~N。 每个节点的编号即为他的权重。输入格式: 只有一组测资。 第一行有三个数字&#xff0c;N、M、Q。 N表示这张图有多少节点&#xff0c; M表示这…

Smart Pointer

以下内容摘自《http://blog.csdn.net/asanscape/article/details/6084600》 Smart Pointer在初始化或释放等操作时&#xff0c;它们是一个对象&#xff0c;用点操作符&#xff0c;其他大部分操作则使用“->”操作符。 For example: _ConnectionPtr m_pConnection.CreateInst…

Maze(BFS处理)

题目再现 题目内容&#xff1a; 给你一个迷宫&#xff0c; S为起点&#xff0c;E为终点。 请你找出走出迷宫所需要花费的最短步数。 你只能往上下左右四个方向移动。输入格式: 第一行有一个数字T&#xff0c;代表有T组测资。 每组测资的第一行有两个数字R、C&#xff0c; 代表…

数据库笔记2:SQL运算符

SQL运算符实例代码教程 - 运算符是一个保留字或字符&#xff0c;主要用于在SQL语句的WHERE子句来执行&#xff0c;比较和算术运算等操作。 加法 -添加任一侧上的操作符的值SQL运算符是什么?运算符是一个保留字或字符&#xff0c;主要用于在SQL语句的WHERE子句来执行&#xff0…