迷宫

题目要求

P1605题目链接

分析

我的思路还比较容易理解,但确实开的数组太多了(最终代码)。
我想开一个递归的DFS搜索,对越界情况进行淘汰 (话说这能算剪枝吗) ,再就是只允许在没被标记为已遍历的地方行进。
DFS用好了确实能搜出结果,但过程中遇到过一个大问题,下面就对此说明。

原先的代码是这样的:

import java.util.Scanner;public class Main {private static int x1, y1, x2, y2;private static int dfs(int x, int y, boolean[][] graph) {if (x < x1 || x > x2 || y < y1 || y > y2 || graph[x][y]) {return 0;} else if (x == x2 && y == y2) {return 1;}graph[x][y] = true;return dfs(x-1, y, graph) + dfs(x+1, y, graph) + dfs(x, y-1, graph) + dfs(x, y+1, graph);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int m = scanner.nextInt(), n = scanner.nextInt(), num = scanner.nextInt();x1 = scanner.nextInt();y1 = scanner.nextInt();x2 = scanner.nextInt();y2 = scanner.nextInt();boolean[][] graph = new boolean[m+1][n+1];for (int i = 0; i < num; i++) {graph[scanner.nextInt()][scanner.nextInt()] = true;}scanner.close();System.out.println(dfs(x1, y1, graph));}}

获取了测试数据2:
in

5 5 5
1 2 5 5
2 1
2 2
2 3
2 4
3 4

out

10

自己在纸上推演了一段时间,发现是由于这个数据挺刁钻(其实不过分啊),卡住了一个口子,所以我的程序就走不进去了。本质上的错误是:忽略了Java数组传引用这个事情。
之前,我写过一篇博客:《探究Java方法的参数传递是值传递还是引用传递》。我承认,里面有的结论我也不是100%确定,但确实也是被这个题逼得没办法。

正因为传的是引用,至少也说明可以改引用,所以我们就很难处理了:一次的遍历就可能“堵上道路”,让其他的递归情况没法进行。
事实上,我们要想递归的同时还开深拷贝的专属标记数组,成本是很高的。

但我也没别打法子,看了看测试范围,很小,那就咬咬牙开数组copy吧(当时对数组拷贝的策略领会的不是很好,可以看这篇文章——《总结Java数组的拷贝和输出》)。

当然了,其实在这种小数组范围内,直接复制很简单也很方便。

AC代码(Java语言描述)

import java.util.Scanner;public class Main {private static int x2, y2, m, n;private static int dfs(int x, int y, boolean[][] graph) {if (x < 1 || x > m || y < 1 || y > n || graph[x][y]) {return 0;} else if (x == x2 && y == y2) {return 1;}graph[x][y] = true;boolean[][] array1 = new boolean[m+1][n+1];boolean[][] array2 = new boolean[m+1][n+1];boolean[][] array3 = new boolean[m+1][n+1];boolean[][] array4 = new boolean[m+1][n+1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {array1[i][j] = graph[i][j];array2[i][j] = graph[i][j];array3[i][j] = graph[i][j];array4[i][j] = graph[i][j];}}return dfs(x-1, y, array1) + dfs(x+1, y, array2) + dfs(x, y-1, array3) + dfs(x, y+1, array4);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);m = scanner.nextInt();n = scanner.nextInt();int num = scanner.nextInt();int x1 = scanner.nextInt();int y1 = scanner.nextInt();x2 = scanner.nextInt();y2 = scanner.nextInt();boolean[][] graph = new boolean[m+1][n+1];for (int i = 0; i < num; i++) {graph[scanner.nextInt()][scanner.nextInt()] = true;}scanner.close();System.out.println(dfs(x1, y1, graph));}}

DFS破解“迷宫问题”(洛谷P1605题题解,Java语言描述)相关推荐

  1. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  2. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  3. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

  4. 麦森数(洛谷P1045题题解,Java语言描述)

    题目要求 题目链接 分析 这题挺经典的,快速幂取模算法,如果求出大数再取模就可能T掉. 之前有篇文章写了这个算法:<快速幂算法详解&&快速幂取模算法详解> 既然是Java, ...

  5. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

  6. 求子集元素之和(洛谷P2415题题解,Java语言描述)

    题目要求 P2415题目链接 分析 这题我觉得--当个数学题做就好了嘛. 有一个数N的情况:result = 1 * N 有两个数N1.N2的情况:result = 2 * (N1+N2) 有三个数N ...

  7. 贪心策略摘果子(洛谷P1478题题解,Java语言描述)

    题目要求 P1478题目链接 分析 本题的低配版题目链接 → 题解 那个题就是纯水题没啥可写的,我除了贴代码无话可说,但这题吧,虽然不算难,但也可一说. 建议大家移步这里 → 精辟题解 这位爷写了本题 ...

  8. N进制正反累加判回文数(洛谷P1015题题解,Java语言描述)

    题目要求 P1015题目链接 分析 开始的时候写了这么一个代码,应该是比较基础的,是十进制的. private static void low() {Scanner scanner = new Sca ...

  9. 试试把OJ题意抽象成物理模型(洛谷P1007题题解,Java语言描述)

    题目要求 P1007题目链接 分析 这题干出的,真有毒... 要是有这种指挥官,也是醉了... 言归正传,这题其实是可以贪心求解的,但我们还可以更加666... 事实上,题干上面那一大篇基本在扯,关键 ...

最新文章

  1. 美国人到底为什么不待见人脸识别技术?
  2. Windows Server入门系列38 访问网络共享
  3. 网站优化上首页不算成功稳定排名才算
  4. Spring Ioc源码分析 之 Bean的加载(4):实例化Bean(createBeanInstance()方法)
  5. 全国大学生数学建模2019年C题机场的出租车问题论文与代码
  6. crt脚本 js 在_crt脚本 js 在_使用SecureCRT自带的脚本录制功能。
  7. 请列举你了解的分布式锁_这几种常见的“分布式锁”写法,搞懂再也不怕面试官,安排!...
  8. 文件的下载学习笔记:
  9. centos7 安装及配置
  10. 马哥学习笔记十八——MySQL进阶之日志管理
  11. java.lang.ClassFormatError
  12. Java版进销存ERP管理系统源码
  13. android蓝牙取sbc音频数据
  14. 计算机大类专业学习c语言之重要性
  15. 使用流程图描述程序的功能与流程
  16. 12-Solidity8.0-view和pure区别
  17. 什么是公网IP和内网IP?
  18. 实现Android手机之间在局域网下传输任意文件
  19. Rockchip平台TP驱动详解
  20. linux安装python教程视频_新手开发者的极简Linux上手Python视频教程

热门文章

  1. 网络操作系统 第四章 磁盘管理
  2. USB 设备驱动(写给自己看的)
  3. 斯坦福-随机图模型-week4.0_
  4. php 关于日期的知识总结
  5. hdu4956 Poor Hanamichi
  6. 使用loadrunner的vb vuser写脚本 运行报错:vbascriptext.dll -25277 -25240
  7. windows-server-2012R2离线中文语言包安装
  8. python 字符串 4位一组_Python基础4- 字符串
  9. java内容寻址_java – 获取方法对象而不按名称寻址方法
  10. undertale人物_传说之下所有人物的照片