用一个整形矩阵matrix表示一个网格,1代表有路,0代表无路,每一个位置只要不越界,都有上下左右四个方向,求从最左上角到右下角的最短通路值
例如,matrix为:
1 0 1 1 1
1 0 1 0 1
1 1 1 0 1
0 0 0 0 1
通路只有一条,由12个1构成,所以返回12
[要求]
时间复杂度为
给定一个N x N 的数字
矩阵
, 每个点都有一个正整数(大小为0-9),从
左上角
出发, 每次只能向右或者向下移动一个单位,直到走到
右下角
为止。求得一条路线,使得这条路线上的数字和最小。
第一行输入 N 表示数字
矩阵
为N行N列
第二行到第 N+1行,每行N个数字 表示N x N
矩阵
第一行输出该路线上的数字和
第二行输出这条路线上的各个数字的行号和列号(如果有多条路径,输出任意一条)
arr=[[1,1,1],[5,1,1],[1,1,1],[1,5,7],[1,1,1]]
m,n=5,3
weight=[[float("inf")]*n for _ in range(m)]
for i in range(m):
for j in range(n):
if i==0 and j==0:
weight[i][j]=arr[i][j]
else:
cur_min=float("inf")
一个机器人位于一个 m x n
网格
的
左上角
(起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到
网格
的
右下角
(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
解法一 直接递归
class Solution {
public:
int UniquePaths(int m,int n,int p,int q...
一个元素值要么0,要么1的
矩阵
,假设0是断路,1是通路,从
左上角
元素开始,向右或者向下走,走到
右下角
。判断能不能走到,如果能,路径长度是多少?
便利蜂开发岗3.20笔试第三道
算法
题
这道题我百度居然没有找到现成的答案,逼着我自己想。
首先想到的是动态规划求
最短路径
可以先将01
矩阵
中的所有0元素替换成一个超大的数(例如106),然后照搬动态规划求
最短路径
,如果路径大于106,说明没有通路。
但是这个方法也太别扭了,像睿智想出来的。
重新想的思路
这道题复杂度应该是比求
最短路径
要低的,因为只要
使用广度遍历法来找最优解。
广度遍历:使用数组,9!=362880,用362880完全可以装完所有的图形
使用bitmap来保存该图形是否到过。0-8表示图形,用3bit表示一个小块,使用1bit表示0在低位还是高位,4bit表示0所处位置。一个图形保存在一个u32中就好了。
所以bitmap的大小事28bit
该类题目还有一种问法
假设有一个6*6的棋盘,每个格子里面有一个奖品(每个奖品的价值在100到1000之间),现在要求从
左上角
开始到
右下角
结束,每次只能往右或往下走一个格子,所经过的格子里的奖品归自己所有。问最多能收集价值多少的奖品。(最多就是max,最短就是min)
这里是引用
[1,3,1],
[1,5,1],
[4,2,1]
输出: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
在这里插入代码片
题目:给定一个n*m的
矩阵
,
矩阵
中元素非负,从
左上角
到
右下角
找一条路径,使得路径上元素之和最小,每次只能向右或者向下走一个方格。如下图所示:
最短路径
是图中绿色部分的元素。
方法一(转换为图中的
最短路径
):我们可以把
矩阵
中的每个方格当做图中的一个顶点,相邻的方格之间有一条边,每个方格最多有两条出边,(当前方格到右侧方格有一条出边,当前方格到下侧方格有一条出边)。我们把
矩阵
中的
最短路径
转