矩阵路径深度搜索

情景

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
    评论
邻接矩阵是一种表示图形的方法,其中矩阵的行和列分别表示图形中的节点,而矩阵中的值表示节点之间的边。深度优先搜索和广度优先搜索是两种常见的图形搜索算法,可以用于遍历图形中的节点。 深度优先搜索(DFS)是一种遍历图形的算法,它从一个起始节点开始,沿着一条路径尽可能深入图形,直到无法继续为止,然后返回并探索其他路径深度优先搜索可以使用递归或堆栈来实现。在邻接矩阵中,深度优先搜索可以通过遍历矩阵的一行来实现。 广度优先搜索(BFS)是一种遍历图形的算法,它从一个起始节点开始,首先访问所有与该节点相邻的节点,然后访问与这些节点相邻的节点,以此类推,直到遍历完整个图形。广度优先搜索可以使用队列来实现。在邻接矩阵中,广度优先搜索可以通过遍历矩阵的一列来实现。 下面是使用Python实现邻接矩阵深度和广度搜索的示例代码: ```python # 邻接矩阵 adj_matrix = [[0, 1, 1, 0], [1, 0, 1,1], [1, 1, 0, 1], [0, 1, 1, 0]] # 深度优先搜索 def dfs(adj_matrix, start, visited): visited[start] = True print(start, end=' ') for i in range(len(adj_matrix)): if adj_matrix[start][i] == 1 and not visited[i]: dfs(adj_matrix, i, visited) # 广度优先搜索 def bfs(adj_matrix, start): visited = [False] * len(adj_matrix) queue = [start] visited[start] = True while queue: node = queue.pop(0) print(node, end=' ') for i in range(len(adj_matrix)): if adj_matrix[node][i] == 1 and not visited[i]: queue.append(i) visited[i] = True # 测试 visited = [False] * len(adj_matrix) dfs(adj_matrix, 0, visited) print() bfs(adj_matrix, 0) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值