诡异的楼梯:
多组数据输入M N,表示大小然后输入地图。*表示墙壁,’.‘表示可以通过,S初始,T结尾位置,‘-’,‘|’代表初始楼梯状况,每隔一秒就会换成对方。-左右走,跳过楼梯,|上下走,跳过楼梯(相当于走两格)
分析:
1:首先要确定上下 和左右的参数设置,不能搞混,我选择a[x][y],x代表上下(行)
2:找到时间最短的点,说明是bfs,并且为了防止爆内存,还要标记走过的路,楼梯不标记,标记过的位置不在走。用的队列还要用优先队列优化
3:难点是’-'和‘|’的处理。因为每秒都会变一次,所以可以要看时间,time%2=0;表示遇到的就是原始的楼梯,time%2=1,代表遇到的是相反的楼梯。
4:难点2就是停留的问题,普通的路是不会停留的,只有遇到楼梯才可能停留,这就是遇到的楼梯过不去的状况,就要判断过去会不会越界,过去的那个点是否已经走过。只有满足条件,对面的点没去过,才会等一次。
附上代码:

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;public class 杭电1180 {static int x[]={0,1,0,-1};static int y[]={1,0,-1,0};//右 上 做 下 static int m,n;       static int x1=0,y1=0,x2=0,y2=0;//起点和抹点static char a[][]=new char[20][20];public static void main(String[] args) {Scanner sc=new Scanner(System.in);                while(sc.hasNext()){                   m=sc.nextInt();//行 n=sc.nextInt();//列 sc.nextLine();          boolean b[][]=new boolean[m][n];//标记是否被走过                                                       for(int i=0;i q1=new PriorityQueue(timecomepare2);   //优先队列优化 q1.add(new zuobiao(x1,y1,0));while(!q1.isEmpty()){zuobiao zuo=q1.poll();//取头并且抛出int x3=zuo.x;int y3=zuo.y;          if(x3==x2&&y3==y2) {System.out.println(zuo.time);break;}else                 for(int i=0;i<4;i ){           if(x3 x[i]=0&&y3 y[i]=0&&!b[x3 x[i]][y3 y[i]])    //这个点没有访问过                  {                        if(a[x3 x[i]][y3 y[i]]=='.')//普通情况,不考虑楼梯{b[x3 x[i]][y3 y[i]]=true;q1.add(new zuobiao(x3 x[i],y3 y[i],zuo.time 1));                 }/** 遇到竖直楼梯,1:上下方向的偶时间可行* 2:左右方向的奇时间可行*/if(a[x3 x[i]][y3 y[i]]=='|')//竖直楼梯 要看时间{if(zuo.time%2==1&&(i==0||i==2))//奇数时间 相当于‘-’;                         {if(y3 y[i] y[i]=0){ b[x3 x[i] x[i]][y3 y[i] y[i]]=true;q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));}}else if(zuo.time%2==0&&(i==1||i==3))//偶数时间  上下                                              {if(x3 x[i] x[i]=0){        b[x3 x[i] x[i]][y3 y[i] y[i]]=true;                           q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));}                         }   else if(y3 y[i] y[i]=0&&x3 x[i] x[i]=0) {//没爬过去并且符合条件if(b[x3 x[i] x[i]][y3 y[i] y[i]]==false)q1.add(new zuobiao(x3,y3,zuo.time 1));}//并且没有被爬过一定要看看是否被爬过,内存卡爆}/** 遇到-方向 1:偶数时间左右方向* 2:奇数时间的上下方向 */if(a[x3 x[i]][y3 y[i]]=='-')//竖直楼梯只能左右走,走两步{if(zuo.time%2==1&&(i==1||i==3))//左右{if(x3 x[i] x[i]=0){      b[x3 x[i] x[i]][y3 y[i] y[i]]=true;                            q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));}}else if(zuo.time%2==0&&(i==0||i==2))//偶数时间                           {if(y3 y[i] y[i]=0)//符合条件(可以跳过去){         b[x3 x[i] x[i]][y3 y[i] y[i]]=true;                                q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));}}   else if(y3 y[i] y[i]=0&&x3 x[i] x[i]=0){if(b[x3 x[i] x[i]][y3 y[i] y[i]]==false)q1.add(new zuobiao(x3,y3,zuo.time 1));}}if (a[x3 x[i]][y3 y[i]]=='T'){ b[x3 x[i]][y3 y[i]]=true;q1.add(new zuobiao(x3 x[i],y3 y[i],zuo.time 1));}                  }}              }       }
public static Comparator timecomepare2 =new Comparator()//实现comparator接口
{public int compare(zuobiao a1,zuobiao a2){return (int)(a1.time-a2.time);}};
}class zuobiao
{   int x;int y;int time;   //走的次数/时间public zuobiao(int x,int y,int time){this.x=x;this.y=y;this.time=time;      }
}

杭电1180java实现(bfs)相关推荐

  1. 杭电1043java实现bfs一遍

    题目Eight Problem Description 这个15难题已经存在了100多年了,即使你不知道它的名字,你也看到了.它由15个滑动瓦片构成,每个滑动瓦片的数量从1到15,并且全部装入4乘4帧 ...

  2. 杭电1430康托 bfs(java)

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

  3. 杭电oj1072java实现bfs

    Nightmare 问题描述 伊格内修斯昨晚有一场噩梦.他发现自己身陷迷宫,身上有一枚定时炸弹.迷宫有一个出口,在炸弹爆炸之前,伊格内修斯应该走出迷宫.炸弹的最初爆炸时间设定为6分钟.为了防止炸弹爆炸 ...

  4. 杭电1044java实现dfs bfs

    Collect More Jewels 问题描述 它写在"夫人的书:创世之后,残酷的神摩洛克反抗了造物主马尔杜克的权威.摩尔从马尔杜克那里偷走了众神中所有神器中最强大的一件,也就是叶多尔的护 ...

  5. 杭电1254java实现(双bfs 优先队列)

    推箱子 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个 ...

  6. 杭电1728bfs逃离迷宫java实现

    Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...

  7. 杭电1108java_按照这个步骤来刷题,迷茫的你两个月亦能成为王者

    原标题:按照这个步骤来刷题,迷茫的你两个月亦能成为王者 作者 | bigsai 来源 | bigsai(ID:bigsai) 前言 大家好,我是bigsai哥哥.最近很多小伙伴问我怎么入门数据结构与算 ...

  8. 多校1(1009)(杭电4308)

    题目: Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  9. hdoj杭电问题分类

    杭电上的题虽然多,但是一直苦于找不到问题分类,网页都是英文的,所以平时做题也没怎么看,今天仔细一看,问题分类竟然就在主页....做了那么久的题居然没发现,表示已经狗带..不要笑,不知道有没有像我一样傻 ...

最新文章

  1. git commit 提交的时候报错husky > pre-commit hook failed (add --no-verify to bypass)(解决办法)
  2. [Modules]PrestaShop插件 模块 – 产品推荐模块 随机展示推荐产品
  3. 用JavaScript实现简单的excel列转sql字符串
  4. 用MFC显示一张图片
  5. 对于国产CPU,他们尽然这么说…
  6. 电脑记事本_带日历的电脑桌面记事本?
  7. Tomcat设置Http自动跳转Https
  8. 前端学习(1176):set数据结构2
  9. USACO / A Game (经典区间DP)
  10. UE4手册中文翻译速查表
  11. iptables防火墙基础
  12. 第一章数据分析与挖掘概述
  13. python源码中的学习笔记_第5章_字典
  14. Windows Azure 基本操作手册
  15. kettle 完成处理后的字母含义,(I)nput, (O)utput, (R)ead, (W)ritten, (U)pdated, (E)rror
  16. 数字化会议管理系统,实现会议全流程管理
  17. 在linux系统下使用service tomcat start命令打开tomcat失败,报Neither the JAVA_HOME nor the JRE_HOME environment vari
  18. NFS挂载失败: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.
  19. HDU1253-胜利大逃亡
  20. CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variabl

热门文章

  1. C++ Primer 5th笔记(chap 15 OOP)继承之派生类
  2. 风力等级表(供参考)
  3. 全网最强Python版《超级玛丽》小游戏,我还是你的马里奥嘛?
  4. buu [BJDCTF 2nd]rsa1
  5. MoeCTF 2021Re部分------Midpython.exe
  6. C#中base64编码与解码
  7. PHP下载功能的实现和获得当前目录
  8. 【Linux】 iptables vs firewalld
  9. 计算两个日期相差的天数
  10. Acwing第 5 场周赛【未完结】