网易面试题之给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步
来源:互联网 发布:尚观linux视频下载 编辑:程序博客网 时间:2024/05/21 22:45
package wangyi;/** * Created by Administrator on 2016/12/7. * 给定一个 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次。 */import java.util.*;public class Test { public static void main(String[] args){ Scanner in = new Scanner(System.in); while (in.hasNext()) {//注意while处理多个case int x=in.nextInt(); int y=in.nextInt(); char[][] points=new char[x][y]; int[][] tar=new int[x][y]; for(int i=0;i<x;i++){ String str=in.next(); points[i]=str.toCharArray(); } int startx=in.nextInt(); int starty=in.nextInt(); int k=in.nextInt(); int[] stepx=new int[k]; int[] stepy=new int[k]; for(int i=0;i<k;i++){ stepx[i]=in.nextInt(); stepy[i]=in.nextInt(); } Queue<Integer> xqueue=new LinkedList<Integer>(); Queue<Integer> yqueue=new LinkedList<Integer>(); //引入队列是为了遍历到最后不能走为止 xqueue.add(startx); yqueue.add(starty); tar[startx][starty]=1; //起始点访问标记;1表示已经访问 while(!xqueue.isEmpty()&&!yqueue.isEmpty()){ startx=xqueue.remove(); //取队首 starty=yqueue.remove(); for(int i=0;i<k;i++){ if(startx+stepx[i]<x&&startx+stepx[i]>=0&&starty+stepy[i]<y&&starty+stepy[i]>=0) //不出界 if(tar[startx+stepx[i]][starty+stepy[i]]==0){ if(points[startx+stepx[i]][starty+stepy[i]]=='.'){ tar[startx+stepx[i]][starty+stepy[i]]=tar[startx][starty]+1; xqueue.add(startx+stepx[i]); yqueue.add(starty+stepy[i]); } else tar[startx+stepx[i]][starty+stepy[i]]=-1; //访问点为X } } } int max=0; int getRoad=1; for(int i=0;i<x;i++) for(int j=0;j<y;j++){ if(points[i][j]=='.'&&tar[i][j]==0){ getRoad=0; //有存在没有被访问的“.”说明不能遍历完全,有些出口到不了。 } max=Math.max(max, tar[i][j]); } if(getRoad==0) System.out.println(-1); else System.out.println(max-1); } }}
0 0
- 网易面试题之给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步
- 网易面试题之 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,
- 设M 是一个m×n 的矩阵,其中每行的元素从左到右单增有序,每列的元素从上到下单增有序。 给出一个分治算法计算出给定元素x 在M 中的位置或者表明x 不在M 中。分析算法的时间复杂性。
- 【Java】给定两个32位的整数N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第 j 位开始,到第 i 位结束。
- 对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置
- 给定一个整数N,求N!末尾有多少个0?N!的二进制表示中最低1的位置?
- homework之进程间的管道通行
- 红绿灯通行规则的图解
- 位置、变换的表示
- 对于给定的一个字符串,统计其中数字字符出现的次数。输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?求N!的二进制表示中最低位1的位置。
- 基于Active X的mfc串口通行小程序
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 我的通行你的证
- qt进程间的通行 QProcess
- linux 软件安装的通行方式
- 构建自由通行的IOS开发者地图
- 国际通行的打字速度评级标准
- linux命令大全——网络通信(二)
- memcached 运行状态参数及存储原理详解
- json-lib之jsonConfig详细使用
- mysql-ubuntu14.04彻底卸载mysql
- Android UI学习和布局优化
- 网易面试题之给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步
- Linux下使用UDP做心跳检测(断线检测)
- PHP中PSR-[0-4]规范
- SQL Server聚集索引和非聚集索引
- Python下ORM的一个设计举例
- 网易面试题之 牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。
- 导入Excel
- 湖南天地图轻松绘分段专题图模块实现简介
- Objective-C常用的函数,常数变量