代码改变世界

[LeetCode] 490. 迷宫 PHP版

2021-03-19 15:37 by 折翼的鸟, 阅读(68) 阅读, 推荐(0) 推荐, 收藏, 编辑

题目描述:

由空地和墙组成的迷宫中有一个球。球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。

给定球的起始位置,目的地和迷宫,判断球能否在目的地停下。

迷宫由一个0和1的二维数组表示。 1表示墙壁,0表示空地。你可以假定迷宫的边缘都是墙壁。起始位置和目的地的坐标通过行号和列号给出。

 

示例:

示例 1:

输入 1: 迷宫由以下二维数组表示

0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0

输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4)
输入 3: 目的地坐标 (rowDest, colDest) = (4, 4)

输出: true

解析: 一个可能的路径是 : 左 -> 下 -> 左 -> 下 -> 右 -> 下 -> 右。

 

 1 $maze = [
 2     [0, 1, 0, 0, 0],
 3     [0, 0, 0, 1, 0],
 4     [0, 1, 0, 1, 0],
 5     [1, 1, 1, 0, 0],
 6     [0, 1, 0, 0, 1],
 7     [0, 1, 0, 0, 0]
 8 ];
 9 
10 
11 function printMaze($maze){
12     for ($i = 0; $i < count($maze); $i++) { 
13         for ($j = 0; $j < count($maze[$i]); $j++) { 
14             echo $maze[$i][$j]." ";
15         }
16         echo "\n";
17     }
18 }
19 
20 
21 function walk($maze, $start, $end){
22     printMaze($maze);
23     // 复制下迷宫, 全部为0, 记录走过的路线
24     $steps = [];
25     for ($i = 0; $i < count($maze); $i++) { 
26         for ($j = 0; $j < count($maze[$i]); $j++) { 
27             $steps[$i][$j] = 0;
28         }
29     }
30     // printMaze($steps);
31 
32     // 上左下右
33     $dirs = [[-1, 0], [0, -1], [1, 0], [0,1]];
34 
35     $queue[] = $start;
36     $k = 1;
37     while (!empty($queue)) {
38         $cur = array_pop($queue);
39 
40         // 等于出口,提前结束
41         if($cur[0] == $end[0] && $cur[1] == $end[1]){
42             break;
43         }
44 
45         for ($z = 0; $z < count($dirs); $z++) { 
46             $i = $cur[0] + $dirs[$z][0];
47             $j = $cur[1] + $dirs[$z][1];
48 
49             // 四个方向挨个相加, 判断有没有超出边界
50             if($i < 0 || $i >= count($maze)){
51                 continue;
52             }
53 
54             if($j < 0 || $j >= count($maze[0])){
55                 continue;
56             }
57 
58             // 撞墙了就跳过
59             if($maze[$i][$j] == 1){
60                 continue;
61             }
62 
63             // 走过了就不要走了
64             if($steps[$i][$j] != 0){
65                 continue;
66             }
67 
68             if($i == $start[0] and $j == $start[1]){
69                 continue;
70             }
71             // 走过的路线记录下
72             $steps[$i][$j] = 2;
73             // 把四个方向能走的 全部记录下来
74             array_push($queue, [$i, $j]);
75         }
76     }
77     echo "\r";
78     printMaze($steps);
79 }
80 walk($maze, [0, 0], [count($maze) - 1, count($maze[0]) - 1]);
81 exit;

 

 

 

php 冒泡排序的两种思路以及优化

2017-11-29 15:29 by 折翼的鸟, 阅读(1665) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:php冒泡排序,两种思路,时间复杂度都是O(n^2),当然最优的时间复杂度就是O(n),以下说的都是正序排列(倒序的话,把内层循环的大于号换成小于号就好了) 第一种冒泡排序 思路就是把第一个数跟所有的数比较,如果碰到比第一个数还小的数字,就把他俩位置交换下,然后把交换后的数字继续往后比较...这样 阅读全文

mysql中timestamp,datetime,int类型的区别与优劣

2015-12-28 22:01 by 折翼的鸟, 阅读(6387) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:转载请注明来自souldak,微博:@evagle以下内容整合筛选自互联网:int1. 占用4个字节2. 建立索引之后,查询速度快3. 条件范围搜索可以使用使用between4. 不能使用mysql提供的时间函数结论:适合需要进行大量时间范围查询的数据表datetime1. 占用8个字节2. 允许为... 阅读全文

php - 观察者模式

2015-12-16 22:13 by 折翼的鸟, 阅读(227) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:如果你修改某一个组件会引起其它组件一连串的改变,那么开发任务会变成产生bug和消除bug的恶性循环。 当然系统中的组件必然包含着对其它组件的引用,然而我们使用不同的策略来尽量减少。 举个例子,假如有一个负责用户登录的类 class login{ public function handle... 阅读全文

Python模板库Mako的用法

2015-05-07 16:35 by 折翼的鸟, 阅读(4728) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:官网地址:http://www.makotemplates.org/文档地址:http://docs.makotemplates.org/中文文档基本用法地址:http://www.open-open.com/lib/view/open1405317963680.html介绍:Mako是一个高性能的... 阅读全文

MAMP 安装phpredis 扩展

2014-11-05 11:39 by 折翼的鸟, 阅读(900) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:phpredis扩展包地址:https://github.com/nicolasff/phpredis1、下载php源码 (http://php.net/releases/ 选择php5.5.10)在/Applications/MAMP/bin/php/php5.5.10/ 目录下建立include... 阅读全文

openerp7 时区问题解决--改成本地时区

2014-04-29 16:08 by 折翼的鸟, 阅读(504) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:由于目前openerp的时区,读取的是UTC时间,而我国本地时间比UTC快8小时问题就导致,写入数据库的时候时间相差8小时,以及Openerp日志输出时间格式也相差8小时和前端显示问题1、更改openerp日志输出时间,如:修改文件:oe_dev/openerp/__init__.pyos.envi... 阅读全文

windows7下python2.6 + mysql5.5(No module named MySQLdb/DLL load failed/from sets import ImmutableSet)

2013-05-15 11:34 by 折翼的鸟, 阅读(468) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:在使用python对MySQL数据库进行操作时,需要安装MySQLdb模块,而该模块的安装经常会遇到很多问题,下面是我在安装MySQLdb过程遇到问题的解决方法:1.下载MySQLdbMySQLdb版本: MySQL-python-1.2.2.win32-py2.6.exe下载地址:http://home.netimperia.com/files/misc/MySQL-python-1.2.2.win32-py2.6.exe参见:http://sourceforge.net/forum/forum.php?thread_id=2316047&forum_id=704602.安装完成后, 阅读全文

python import的用法

2013-05-15 10:36 by 折翼的鸟, 阅读(611) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:【转自http://blog.sina.com.cn/s/blog_4b5039210100ennq.html】在python用import或者from...import来导入相应的模块。模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中,我们就可以使用了。这类似于C语言中的include头文件,Python中我们用import导入我们需要的模块。eg:import sysprint('================Python import mode==========================' 阅读全文

linux命令后台运行

2013-05-14 14:13 by 折翼的鸟, 阅读(221) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:有两种方式: 1. command & : 后台运行,你关掉终端会停止运行 2. nohup command & : 后台运行,你关掉终端也会继续运行一、 简介 Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务。因此在任务管理上也有别具特色的管理思想。我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和bg 命令,让你轻松调度正在运行的任务。假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,挂起这个程序,然 阅读全文
点击右上角即可分享
微信分享提示