情景
coding.net为了活跃气氛,春节期间出了一个鸡年猴语言的娱乐coding,2月2号的谜题是矩阵路径
[path_in_matrix]算法。
#鸡年猴语言#
矩阵路径是这样一个点序列:从给定矩阵中任一数字标记的点出发,每一步可以向左、右、上、下四个方向之一移动一格到达下一个点,依次类推而得到的点序列,一条矩阵路径最少包含两个点,同一个点可以多次出现在一条矩阵路径上。现用点的标记数字组成的序列来表示这样的矩阵路径,例如 1 5 6 7 是矩阵中的一条路径,而 8 5 1 4 就不是。判定输入的序列是否表示了一个合规的矩阵路径,若是,输出 1,若不是,输出 0。input 会给出多组序列,每组中间用 0 做分隔符。给定的矩阵如下:
1 2 3 4
5 6 7 8
1 4 2 6
3 5 1 7参与方式:在冒泡话题 #鸡年猴语言# 下首行添加题目注释,像这样:
#鸡年猴语言#
//[path_in_matrix]勤劳的自动检测机器人 @monkey_worker 就会运行你的程序并且将输出值和是否成功评论在你的冒泡下方。
了解更多游戏规则及猴语言语法
Tips:如何从 input 读取数值呢?参考这些代码
实现
算法其实就是矩阵的深度搜索,但是同一节点可以多次出现在同一条路径中。
PHP实现:
<?php
/**
* 矩阵路径是这样一个点序列:从给定矩阵中任一数字标记的点出发,每一步可以向左、右、上、下四个方向之一移动一格到达下一个点,依次类推而得到的点序列,一条矩阵路径最少包含两个点,同一个点可以多次出现在一条矩阵路径上。
* 现用点的标记数字组成的序列来表示这样的矩阵路径,例如 1 5 6 7 是矩阵中的一条路径,而 8 5 1 4 就不是。判定输入的序列是否表示了一个合规的矩阵路径,若是,返回 true,若不是,返回 false。
*/
function hasPath(array $matrix, array $str)
{
if (empty($matrix) || !isset($matrix[0])) {
return false;
}
if (!isset($matrix[0])) {
if (count($matrix) == 1 && count($str) == 1 && $matrix[0][0] == $str[0]) {
return true;
}
}
for ($i = 0; $i < count($matrix); $i++) {
for ($j = 0; $j < count($matrix[0]); $j++) {
if (dfs($matrix, $i, $j, 0, $str)) {
return true;
}
}
}
return false;
}
function dfs($matrix, $rows, $cols, $start, $str)
{
if ($rows < 0 || $rows >= count($matrix) || $cols < 0 || $cols >= count($matrix[0]) || $start < 0) {
return false;
}
if ($start == count($str)) {
return true;
}
if ($matrix[$rows][$cols] === $str[$start]) {
return dfs($matrix, $rows, $cols + 1, $start + 1, $str) ||
dfs($matrix, $rows, $cols - 1, $start + 1, $str) ||
dfs($matrix, $rows + 1, $cols, $start + 1, $str) ||
dfs($matrix, $rows - 1, $cols, $start + 1, $str);
}
return false;
}
$matrix = [
[1,2,3,4],
[5,6,7,8],
[1,4,2,6],
[3,5,1,7]
];
$str = [1,5,6,4];
$str = [3,7,8,6,7,1];
$str = [2,1,5,8,6];
var_dump(hasPath($matrix, $str));
上面三条路打印结果分别为:true
true
false
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。