Problem Description
  给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
Input
  第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
  第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符’.‘表示该位置为空地,字符’*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
Output
  每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
Sample Input
2
5 5
…**
*..



1 1 1 1 3
5 5

*.
*.


*…
2 1 1 1 3
Sample Output
no
yes
首先论对宽搜的认识,学习数据结构之前,一直看不懂什么是宽搜,当时遇到搜索题很是苦恼,只会用回溯法进行深搜,还是利用到了函数运行的机制(类似递归),第一次真正明白宽搜的运行机制是二叉树的遍历,有一种用队列的遍历方式(二叉树链接)才明白宽搜的运行机制,面对这题,深搜超时,可能有的大神优化能过。但是首先想到的应该是宽搜,核心点是转弯的次数。
1:刚开始我打算用boolean数组标记走过的位置,用class新类time表示点的转弯次数,后来错了。想了一想错的原因,右下右转两次,如果下右右只有一次但是晚走而没法走,所以这种想法是错的。
2:用数组标记当前点的最小转弯,如果新点,入队。若果比这个点的转弯次小于等于,也可以入队。这样就能保证最终找到最终答案,但是还是不过,超时。至于原因:楼梯模型(要克服楼梯的走楼梯而不直走的问题)
3:最终处理方案:使用优先队列,(java的需要自己百度学习一下),因为漫天都是C类的代码,教程,我根本不知道那个是优先队列。必须用优先队列优化。后来请教了学长帮我解决。优先队列让小节点先 入队。
wa了28次,第29次终于过了。
代码如下:

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
/** bfs 标记节点,计入最小节点 优先队列优化*/
public class 杭电1728bfs {static int a[][]= {{-1,0},{0,1},{1,0},{0,-1}};//左 上 右 下static boolean judgle=false;public static void main(String[] args) {   Scanner sc=new Scanner(System.in);int t=sc.nextInt();     //测试数据 for(int t1=0;t1 q1=new PriorityQueue<>(timecomepare);e[y][x]=-1;q1.add(new zuobiao(x,y));       while(!q1.isEmpty()){zuobiao exa=q1.peek();//头坐标q1.poll();int x1=exa.x;int y1=exa.y;if(x1==x2&&y1==y2){if(exa.time<=k) {judgle=true;break;}}    elsefor(int i=0;i<4;i ){if(x1 a[i][0]<0||x1 a[i][0]>n-1||y1 a[i][1]<0||y1 a[i][1]>m-1||c[y1 a[i][1]][x1 a[i][0]]==false){}//不能走或者走过   else                                        {zuobiao zuo=new zuobiao(x1 a[i][0],y1 a[i][1],exa.time,exa.fangxiang);zuo.fangxiang=i;if(zuo.fangxiang!=exa.fangxiang) {zuo.time ;}if(e[y1 a[i][1]][x1 a[i][0]]>=zuo.time)//转头次数小于等于,入队{q1.add(zuo);e[y1 a[i][1]][x1 a[i][0]]=zuo.time;}                                                                    else if(e[y1 a[i][1]][x1 a[i][0]]==0){//初始的没用过,入队q1.add(zuo);e[y1 a[i][1]][x1 a[i][0]]=zuo.time;          }        } }}}public static Comparator timecomepare =new Comparator()//实现comparator接口{public int compare(zuobiao a1,zuobiao a2){return (int)(a1.time-a2.time);}};
}
class zuobiao
{int x;int y;int time;int fangxiang;public zuobiao(int x,int y){this.x=x;this.y=y;this.fangxiang=-1;this.time=-1;}public zuobiao(int x,int y,int time,int fangxiang){this.x=x;this.y=y;this.time=time;this.fangxiang=fangxiang;}}

不知道有什么不妥或者不对的地方。请大神更正

杭电1728bfs逃离迷宫java实现相关推荐

  1. 赛马网ACM试题(原杭电oj ACM)java版答案(1000,10001,1002)

    赛马网ACM试题(原杭电OJ ACM试题)答案(java版) Author : Zhang Hailong   Date   : 2015-09-17    HomePage : http://  E ...

  2. 杭电acm2059-龟兔赛跑 java

    一看题就知道是动态规划,不过这要看下如何设置变化数组了 先分析这道题:兔子到达终点的时间时固定的,因此只需要考虑乌龟了,乌龟骑电车和骑自行车的时间,然后计算,因为中间有N个充电站,可以看做N个点(到起 ...

  3. 杭电2566_统计硬币——java

    Problem Description 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). Input 输入数据第一行有一个正整数T ...

  4. 杭电4524-郑厂长系列故事——逃离迷宫

    郑厂长系列故事--逃离迷宫 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  5. 杭电 1272 poj 1308 小希的迷宫

    这道题是我学了并查集过后做的第三个题,教我们的学姐说这是并查集的基础题,所以有必要牢牢掌握. 下面就我做这道题的经验,给大家一些建议吧!当然,我的建议不是最好的,还请各位大神指出我的错误来,我也好改正 ...

  6. java最简单的并查集(不想交集合)以及杭电1272

    并查集要有的一些属性:value:表示当前值,指针:(不一定是指针)指向父节点. 还有一个属性number:表示该树存在的总个数.(也可以用深度表示).我用小树插在大树上. 如果是普通数字表示的树,可 ...

  7. 用java爬取杭电oj已ac代码

    前言 电脑的硬盘突然坏了,新安装的eclipse的代码全没了,后来发现杭电上已经ac的代码可以查看到,我是个有强迫症的人,我宁愿做很多件不同的事也不愿意做一件相同的事(复制黏贴)许多次,所以就突发奇想 ...

  8. 杭电1430康托 bfs(java)

    魔板: Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版--魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板 ...

  9. 杭电1284钱币兑换问题—背包dp/母函数(java)

    Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Out ...

最新文章

  1. JS获取屏幕,浏览器,网页高度宽度
  2. 地图统计_连吃七八个都不够!太仓不完整包子统计地图来了!
  3. html多级折叠菜单表单,JS实战篇之收缩菜单表单布局
  4. 思杰20140522
  5. 认识与入门 Markdown
  6. P7 P8:训练神经网络
  7. js 时间任意格式化 ,又来造轮子了
  8. subprocess模块(了解)
  9. 计算机excel素材,excel操作练习题素材.doc
  10. easyui 合并单元格
  11. matlab工作区显示的是什么,matlab工作区介绍
  12. 手机修改php代码,修改Android设备信息,如修改手机型号为_php
  13. python 查找二维数组长度_Python二维数组中的查找
  14. 不知原谅什么,诚觉世事尽可原谅
  15. 029. 露从今夜白,月是故乡明
  16. mysql 中tinyint(1)
  17. Oracle hint认识
  18. python樱花代码_武大学生用Python敲出樱花开放(附源码)
  19. HTML5图片与文本对齐方式
  20. 红图新媒体让你知道提升新媒体广告ROI需要关注的10个指标,

热门文章

  1. 深度探索C++ 对象模型(2)-类的对象的内存大小
  2. 公钥密码体制(RSA,椭圆曲线密码,ElGamal
  3. 【Python Turtle合集】”外面的花已经开得很像样了, 我看到风拥作一团, 前来庆贺“(春天来啦~)
  4. [ARM异常]-中断的术语介绍:target,assert,taken,acknowledge
  5. mysql范围条件_MySQL 索引及优化实战(一)
  6. 逆向寒假生涯(27/100)
  7. 异或交换值(有趣点)
  8. python向图片里添加文字
  9. 1、CSS样式及其基本语法
  10. 3、MySQL查看存储过程