题目描述

给定一个 n 行 m 列的地牢,其中 ‘.’ 表示可以通行的位置,’X’ 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。

输入描述

每个输入包含 1 个测试用例。每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示地牢的长和宽。接下来的 n 行,每行 m 个字符,描述地牢,地牢将至少包含两个 ‘.’。接下来的一行,包含两个整数 x0, y0,表示牛牛的出发位置(0 <= x0 < n, 0 <= y0 < m,左上角的坐标为 (0, 0),出发位置一定是 ‘.’)。之后的一行包含一个整数 k(0 < k <= 50)表示牛牛合法的步长数,接下来的 k 行,每行两个整数 dx, dy 表示每次可选择移动的行和列步长(-50 <= dx, dy <= 50)

输出描述

输出一行一个数字表示最坏情况下需要多少次移动可以离开地牢,如果永远无法离开,输出 -1。以下测试用例中,牛牛可以上下左右移动,在所有可通行的位置.上,地牢出口如果被设置在右下角,牛牛想离开需要移动的次数最多,为3次。

示例

输入

3 3



0 1
4
1 0
0 1
-1 0
0 -1
输出
3

这是一道BFS的题,初步看来比较简单,但是坑点比较多。
地牢的出口可能在任意某个可以通行的位置上。也就是说出口是不定的,每一个能走的点都可能是出口。然后要计算的是一个最坏的情况。
具体代码如下:

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class DungeonEscape {public static void main(String[] args) {int minStep = bfs();System.out.println(minStep);}static int bfs() {Scanner sc = new Scanner(System.in);// n,m是地牢的大小int n = sc.nextInt();int m = sc.nextInt();// map 存的是地牢的地图char[][] map = new char[n][m];// mark用于表示走到该地所走的步数int[][] mark = new int[n][m];for (int i = 0; i < n; i++) {String str = sc.next();map[i] = str.toCharArray();}// 初始化mark,用-1表示没走过的点for (int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {mark[i][j] = -1; // 用-1表示该点未走}}// x0,y0表示起始点int x0 = sc.nextInt();int y0 = sc.nextInt();// 共有k总走法int k = sc.nextInt();int[] stepx = new int[k];int[] stepy = new int[k];for (int i = 0; i < k; i++) {stepx[i] = sc.nextInt();stepy[i] = sc.nextInt();}// 用一个队列存放坐标Queue<Point> queue = new LinkedList<>();mark[x0][y0] = 0;   // 初始化起始点的所走的步数queue.add(new Point(x0, y0));while (!queue.isEmpty()) {int startx = queue.peek().x;int starty = queue.poll().y;for (int i = 0; i < k; i++) {if (startx + stepx[i] >= 0 && startx + stepx[i] < n&& starty + stepy[i] >= 0 && starty + stepy[i] < m&& map[startx + stepx[i]][starty + stepy[i]] == '.'&& mark[startx + stepx[i]][starty + stepy[i]] == -1) {int x = startx + stepx[i];int y = starty + stepy[i];mark[x][y] = mark[startx][starty] + 1;queue.add(new Point(x, y));}}}// 找到最大的步数int max = 0;boolean flag = true;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (map[i][j] == '.' && mark[i][j] == -1) {  // 说明有些点没有遍历到flag = false;}max = Math.max(max, mark[i][j]);}}if (flag)return max;elsereturn -1;}static class Point {int x;int y;public Point(int x, int y) {this.x = x;this.y = y;}}

网易编程题之地牢逃脱相关推荐

  1. 2018校招笔试题——网易编程题跳石板

    题目与要求如下所示: [编程题] 跳石板 时间限制:1秒 空间限制:32768K 小易来到了一条石板路前,每块石板上从1挨着编号为:1.2.3....... 这条石板路要根据特殊的规则才能前进:对于小 ...

  2. 《网易编程题》计算糖果

    题目描述 A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息: A - B, B - C, A + B, B + C. 这四个数值.每个 ...

  3. 《网易编程题》藏宝图

    题目描述 牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列.注意,子 ...

  4. 《网易编程题》下厨房

    题目:牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第 i 行,表示完成第 i 件料理需要哪些 ...

  5. 【网易编程题】小易魔法王国采购魔法神器

    原题: 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投入x个 ...

  6. 网易笔试题:地牢逃脱

    给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步 ...

  7. 《网易编程题》疯狂队列

    小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列.有一次,n个学生在列队的时候,小易老师正好去卫生间了.学生们终于有机会反击了,于是学生们决定来一次 ...

  8. 《网易编程题》买苹果

    题目描述 小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分). 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带.如果不能购买恰好n个苹果 ...

  9. 《网易编程题》分苹果

    题目描述 n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少 ...

  10. 网易编程题------操作序列

    题目描述 小易有一个长度为n的整数序列,a_1,...,a_n.然后考虑在一个空序列b上进行n次以下操作: 1.将a_i放入b序列的末尾 2.逆置b序列 小易需要你计算输出操作n次之后的b序列. 输入 ...

最新文章

  1. Nat. Methods | 学习微生物与代谢产物之间相互作用的神经网络
  2. YouTube、微博、今日头条齐齐发力,短视频平台如何打造头部内容、做好用户留存?
  3. 高精度乘法 c语言,很大的数相乘怎么办?
  4. 逻辑回归线性支持向量机
  5. 【2018CPCP-Final G:】Pastoral Life in Stardew Valley
  6. 创建Tapestry5 工作环境
  7. dos盘启动计算机,u盘dos启动盘怎么制作 u盘dos启动盘制作步骤【详细介绍】
  8. SAF手持式频谱分析仪SC和手持式信号发生器SG的应用概述
  9. MacBook 如何使用两个微信(微信双开)
  10. 进入网页就自动弹出层
  11. Linux NFS配置固定端口
  12. python 破解验证码之二:OCR tesseract识别验证码
  13. js将数字转换成中文大写
  14. SpringCloud及SpringCloudAlibaba微服务组件
  15. 第二章 编程初步 Ivor Horton
  16. 关系数据模型的三个组成部分(关系数据模型的三个组成部分)
  17. MAC | svn: E175002: DAV request failed: 411 Content length required.
  18. 数据结构和算法视频学习
  19. 字节Scala面试题(2) --- 伴生对象
  20. 更改完善后的导出实现(使用FreeMarker导出Word文档,在浏览器实现的导出下载,和上一篇导出主要是代码的更改,流程无变化)

热门文章

  1. mac 连接android手机调试,mac连接华为手机,无法真机调试。
  2. 关于SRE方法论的一些笔记
  3. Android多媒体开发框架
  4. 中国裁判文书网爬虫思路详细分析 (2018年11月上旬可用)
  5. win7修改ftp服务器密码,win7ftp服务器设置用户名密码设置
  6. ubuntu中耳机声音小的解决方案
  7. 学习java哪个网课最好_学习Java的最佳方法
  8. Conent7.0安装lanp全过程
  9. c语言经典程序100例加注释,C语言经典100例
  10. chrome误删书签恢复