题目描述

这天,小明在玩迷宫游戏。

迷宫为一个 n × n 的网格图,小明可以在格子中移动,左上角为 (1, 1),右下角 (n, n) 为终点。迷宫中除了可以向上下左右四个方向移动一格以外,还有 m 个双向传送门可以使用,传送门可以连接两个任意格子。

假如小明处在格子 (x1, y1),同时有一个传送门连接了格子 (x1, y1) 和 (x2, y2),那么小明既可以花费 1 的步数向上下左右四个方向之一走一格 (不能越过边界),也可以花费 1 的步数通过传送门走到格子 (x2, y2) 去。

而对于同一个迷宫,小明每次进入的初始格子是在这 n × n 个格子中均匀随机的 (当然运气好可以直接随机到终点),他想知道从初始格子走到终点的最短步数的期望值是多少。

输入格式

输入共 1 + m 行,第一行为两个正整数 n, m。

后面 m 行,每行四个正整数 xi1, yi1, xi2, yi2 表示第 i 个传送门连接的两个格子坐标。

输出格式

输出共一行,一个浮点数表示答案 (请保留两位小数)。

样例输入

2 1
1 1 2 2

样例输出

0.75

思路:一看就是搜索题,一开始想的是用深搜,写个循环,依次查找每个点到终点的步数,然后相加求结果,结果说什么killed,很懵逼,然后开始想法剪枝,若搜索过程中,该次搜索的步数大于之前搜索到终点的最小值还大,那就终止,结果还是错。而且用深搜的时候还遇到了map.containsKey错误的情况,原因是map里存了自己定义的类,要重写hashCode()和equals()方法。
然后想到了反向广搜,起始点为终点,然后向其他点走,走到某个点的步数就是该点到终点的步数,注意,这样搜索必然是最短路径,因为BFS有最短路效应。
然后写了一发还是错,又想到了,某个点的传送门不一定是唯一的。
所以最后用Map<Integer,List<int[]>>存一下传送门的位置。终于ac.

DFS错误代码

import java.util.*;public class Main {static int N = 200005;static int mod = 1000000007;static int[]dp = new int [N];static char[][] str = new char[1005][1005];static int vis[][] = new int [2005][2005];static int cnt=1;static int n=0;static double sum=0;static double res = 9999999;static int a[][] = new int[2005][2005];static Map<node,node> map = new HashMap<>();static int dirx[] ={-1,0,1,0};static int diry[] ={0,1,0,-1};public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();int m = sc.nextInt();for(int i=0;i<m;i++){int x1 = sc.nextInt();int y1 = sc.nextInt();int x2 = sc.nextInt();int y2 = sc.nextInt();map.put(new node(x1,y1),new node(x2,y2));}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dfs(i,j,0);sum+=res;//System.out.println(res);res=9999999;}}System.out.println(String.format("%.2f",sum/(n*n)));sc.close();}public static void dfs(int x,int y,double cnt){if(x==n&&y==n){res = Math.min(res,cnt);return;}vis[x][y]=1;if(map.containsKey(new node(x,y))){node temp = map.get(new node(x,y));dfs(temp.x,temp.y,cnt+1);}for(int i=0;i<4;i++){int nx=x+dirx[i];int ny=y+diry[i];if(vis[nx][ny]==0&&nx>0&&nx<=n&&ny>0&&ny<=n){dfs(nx,ny,cnt+1);}}vis[x][y]=0;}
}
class node{int x;int y;public node() {}public node(int x, int y) {this.x = x;this.y = y;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + x;result = prime * result + y;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;node other = (node) obj;if (x != other.x)return false;if (y != other.y)return false;return true;}}

BFS正确代码

import java.util.*;public class Main {static int N = 200005;static int mod = 1000000007;static int[]dp = new int [N];static char[][] str = new char[1005][1005];static int vis[][] = new int [2005][2005];static int cnt=1;static int n=0;static double sum=0;static double res = 9999999;static int a[][] = new int[2005][2005];static Map<Integer,List<int[]>> map = new HashMap<>();static int b[][] = new int[2005][2005];static int dirx[] ={-1,0,1,0};static int diry[] ={0,1,0,-1};public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();int m = sc.nextInt();for(int i=0;i<m;i++){int x1 = sc.nextInt();int y1 = sc.nextInt();int x2 = sc.nextInt();int y2 = sc.nextInt();if(!map.containsKey(x1*n+y1)){map.put(x1*n+y1,new ArrayList<>());}map.get(x1*n+y1).add(new int[]{x2,y2});if(!map.containsKey(x2*n+y2)){map.put(x2*n+y2,new ArrayList<>());}map.get(x2*n+y2).add(new int[]{x1,y1});}LinkedList<node>q = new LinkedList<>();q.offer(new node(n,n,0));while(!q.isEmpty()){node temp = q.peek();q.remove();if(map.containsKey(temp.x*n+temp.y)){List<int[]> list = map.get(temp.x*n+temp.y);for(int i=0;i<list.size();i++){int[] t = list.get(i);if(a[t[0]][t[1]]==0){a[t[0]][t[1]]=temp.step+1;q.offer(new node(t[0],t[1],a[t[0]][t[1]]));}}}for(int i=0;i<4;i++){int nx = temp.x+dirx[i];int ny = temp.y+diry[i];if(a[nx][ny]==0&&nx>0&&nx<=n&&ny>0&&ny<=n){a[nx][ny]=temp.step+1;q.offer(new node(nx,ny,a[nx][ny]));}}}a[n][n]=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){//System.out.print(a[i][j]);sum+=a[i][j];}//System.out.println();}System.out.println(String.format("%.2f",sum/(n*n)));sc.close();}public static void dfs(int x,int y,double cnt){if(cnt>res){return;}if(x==n&&y==n){res = Math.min(res,cnt);return;}vis[x][y]=1;if(b[x][y]!=0){int nx = b[x][y]/n;int ny = b[x][y]%n;if(ny==0){nx--;ny=n;}dfs(nx,ny,cnt+1);}for(int i=0;i<4;i++){int nx=x+dirx[i];int ny=y+diry[i];if(vis[nx][ny]==0&&nx>0&&nx<=n&&ny>0&&ny<=n){dfs(nx,ny,cnt+1);}}vis[x][y]=0;}
}
class node{int x;int y;int step;public node() {}public node(int x, int y, int step) {this.x = x;this.y = y;this.step = step;}}

蓝桥杯2022年第十三届决赛真题-迷宫相关推荐

  1. 蓝桥杯2022年第十三届决赛真题-修路

    题目描述 这天,小明在修路. 他需要修理两条平行的道路 A, B,两条路上面分别有 n 个和 m 个点需要维修,它们相对于道路起点的距离分别为 a1, a2, . . . , an 和 b1, b2, ...

  2. 蓝桥杯省赛考点_【蓝桥杯单片机01】从历年决赛真题中寻找单片机常见的考点...

    [蓝桥杯单片机01]从历年决赛真题中寻找单片机常见的考点 广东职业技术学院  欧浩源 [第三届:门禁系统] 1.功能简述 "门禁系统"主要有两种工作模式: 模式1:7:00-22: ...

  3. 蓝桥杯2022年第十三届嵌入式详解

    此前也发了关于蓝桥杯的题目,昨天刚比完赛,放松了一下,没来得及整理,早上我就把我所有的思路整理了一下,发出来,希望能帮到大家.当然也有很多不足的地方,希望大家能提出,我们一起讨论. 首先,关于题目的功 ...

  4. 蓝桥杯2022年第十三届省赛真题-纸张尺寸

    题目描述 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取下整(实际裁 ...

  5. 蓝桥杯题目 2682: 蓝桥杯2022年第十三届省赛真题-GCD

    题目描述 给定两个不同的正整数 a, b,求一个正整数 k 使得 gcd(a + k, b + k) 尽可能大,其中 gcd(a, b) 表示 a 和 b 的最大公约数,如果存在多个 k,请输出所有满 ...

  6. 消除游戏——蓝桥杯2022年第十三届省赛真题

    题目描述 在一个字符串 S 中,如果 S i = S i−1 且S i 不等于S i−1,则称 S i 和 S i+1 为边缘字符.如果S i 不等于S i−1且 S i = S i+1,则 S i− ...

  7. 每日一题——质因数个数(蓝桥杯2022年第十三届省赛真题)

    如何将一个正整数分解质因数:每日一题--将一个正整数分解质因数_笨小古的博客-CSDN博客 题目描述:给定正整数 n,请问有多少个质数是 n 的约数. 输入格式:输入的第一行包含一个整数 n. 输出格 ...

  8. 蓝桥杯2022年第十三届省赛真题-选数异或

    题目描述 给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x . 输入 输 ...

  9. 蓝桥杯第十三届决赛真题-左移右移

    左移右移 一.思路分析 二.数组模拟双链表❗️❗️ 三.代码展示 题目链接 问题描述 小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3, -N . 之后小蓝对这个数组进行了 M 次操作 ...

  10. 蓝桥杯2022年第十三届省赛真题-积木画

最新文章

  1. 亚信产业互联网生态亮相2016南京软博会
  2. UvaUva11059 最大乘积
  3. 学计算机的快毕业要学论文吗,学计算机的好写毕业论文吗?
  4. 如何通过预加载器提升网页加载速度
  5. 电路串联和并联图解_负反馈型三极管放大电路的识图方法
  6. 总结《Ray Tracing in One Weekend》
  7. SpringBoot结合Druid配置JNDI多数据源
  8. JAVA多线程----用--取钱问题1
  9. Winform UI界面设计例程——ListView控件
  10. 逻辑为基、数企赋能(NO.9)—企业运营体系顶层逻辑之困
  11. bzoj 4246: 两个人的星座 计算几何
  12. 你该知道的Pyecharts简易上手教程
  13. CREATE PROCEDURE
  14. 做事效率太低?你必须改掉这7种坏习惯
  15. JS逆向入门学习之回收商网,手机号码简易加密解析
  16. [Android精品源码] Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市
  17. 航空母舰与钢铁侠助阵,这么硬核的智能锁你见过么
  18. js弹出提示信息并自动关闭
  19. LabVIEW谨慎使用局部变量和全局变量
  20. 超人视觉启蒙班第一讲

热门文章

  1. vss跟tfs_从VSS 2005迁移到TFS 2010后,VS 2008出现“差异”错误
  2. 堆排序算法思路以及Java实现
  3. 三维全景拍摄这些技巧很实用
  4. 龙芯2f笔记本安装debian错误--bzcat
  5. matlab时域采样与频域采样,实验二:时域采样与频域采样.doc
  6. 谷歌闹别扭期间女生创办“谷姐”网(cnblogs)
  7. centos 切换终端_centos进入不同终端的几种方法
  8. robotium测试
  9. 五种对称加密算法总结
  10. Python 爬虫学习笔记(七(2))JsonPath解析+实战