[编程题] 地牢逃脱

给定一个 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

import java.util.*;

public class Main {

    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);

                  

               }

       }

}

				
时间: 2024-10-19 01:31:36

[编程题] 地牢逃脱的相关文章

POJ C程序设计进阶 编程题#3:运算符判定

编程题#3:运算符判定 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 两个整数 a 和 b 运算后得到结果 c.表示为:a ? b = c,其中,?可能是加法 +,减法 -,乘法 *,整除 / 或 取余 %.请根据输入的 a,b,c 的值,确定运算符.如果某种运算成立,则输出相应的运算符,如果任何运算都不成立,则输出 error. 例如: 输入: 3,4,5 输出: er

中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

期末考试编程题 返回 这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 细胞自动机(30分) 题目内容: 这是细胞自动机的非图形版本.细胞自动机是指在一个二维网格内,每一个网格是一个细胞.每个细胞有活和死两种状态. 初始时刻,有些细胞是活的,有些细胞是死的.自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活.具体的规则如下:

京东校招笔试(C++方向)编程题

这次笔试是今年校招我参加的第一次笔试..出了很多状况,基础知识不扎实,导致选择题耽误了太多时间,导致后面的题目没做完,编程题也没有在 时间内写出来,基本没有面试机会了.不过我继续研究第二个编程题,在10几分钟后做了出来. 这个题目具体已经不记得了,但是大概意思还是记得,我们把由4和7组成的数,按小大排序,例如:4 7 44 47 74 77 444 447 474 477 744 747 774 777 他们的序号依次为1,2,3,4.....,题目的输入是每行输入一个整数,可以很大(好像是最大

网易有道内推编程题

[编程题] 洗牌 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆).接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌.接着把牌合并起来就可以了. 例如有6张牌,最开始牌的序列是1,2,3,4,5,6.首先分成两组

2016携程测试实习生笔试编程题

四道大题: 第一道题,是携程网站有一个725*286(具体不记得了)广告区域,能想到的测试类型及方法. 写测试用例——2016年1月1日到2016年3月1日同一订单往返机票立减50 全部功能点. 第二道题,sql语句.(该学sql- -) 第三道题,编程题: 有N个球,M个颜色(M小于等于N),求要想从这N个球里拿出全部(M)个颜色的球,至少需要拿多少个. 思路: 我又是用map实现的,当map的size==M的时候,就说明颜色已经集齐了,计算一个minNum,然后继续扫描,更新minNum 感

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.

期末考试——编程题#2:能被3,5,7整除的数

编程题#2:能被3,5,7整除的数 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个整数,判断它能否被3,5,7整除,并输出以下信息: 1.能同时被3,5,7整除(直接输出3 5 7,每个数中间一个空格): 2.能被其中两个数整除(输出两个数,小的在前,大的在后.例如:3 5或者 3 7或者5 7,中间用空格分隔) 3.能被其中一个数整除(输出这个除数) 4.不能被任

挑战编程题(三)

接 挑战编程题(二)http://www.cnblogs.com/qiange/p/5090588.html 题目: 有两个非负数的链表,每个链表都反序的存储一个多位数字的每一位,(例如:链表2->4->3  数字342),现在求两个链表数字的相加,求和的链表. 例如: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 /** * Definition for singly-linked lis

POJ C++程序设计 编程题#10:输出指定结果二

编程题#10:输出指定结果二 来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 总时间限制: 1000ms 内存限制: 1024kB 描述 通过填空使得程序输出的结果符合下面的要求. #include <iostream> #include <map> using namespace std; // 在此处补充你的代码 int A::count = 0; void func(B b) { } int mai