矩阵路径深度搜索

情景

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值