Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 矩阵中的方法数_Algorithm - Fatal编程技术网

Algorithm 矩阵中的方法数

Algorithm 矩阵中的方法数,algorithm,Algorithm,我们得到了一个0和1的nxn平方矩阵。0表示封闭单元,1表示机器人可以行走的开放单元。如果您的机器人最初处于(0,0),到达(n-1,n-1)的方式有多少。 你的机器人可以向左、向右、上下移动。路径必须是不同的。如果有一个循环,那么可以将路径计算为1,而不是无限大。例如对 7x7矩阵。 10101101 011011 10110 011011 01 01 01 01 01101 0 0 1 1 1 是4 这4条路径是: __001 0_01 1 1 1_1010 0_01 0_01 0 1

我们得到了一个0和1的nxn平方矩阵。0表示封闭单元,1表示机器人可以行走的开放单元。如果您的机器人最初处于(0,0),到达(n-1,n-1)的方式有多少。
你的机器人可以向左、向右、上下移动。路径必须是不同的。如果有一个循环,那么可以将路径计算为1,而不是无限大。例如对 7x7矩阵。

10101101
011011
10110
011011
01 01 01 01
01101
0 0 1 1 1

是4

这4条路径是:
__001
0_01 1 1
1_1010
0_01
0_01 0 1
0\u0\u0 1
0 0 0_u0_u0_0

__001
0_01 1 1
1_1010
0_01_uu_uu
0_00_0_0\u0
0\uu0\uu0\u0
0 0 1 1_uu

__001
0_01 1 1
1_u01 0
0110_u11
01 0 0_01
01_01
0 0 0_u0_u0_0

__001
0_01 1 1
1_u01 0
0 1 0_u__
01 01 0 01 0_u
0 1 0_uu
0 0 1 1_uu

我用dp解决了机器人只能左右移动的问题。请帮我做同样的算法。 我是否必须将其转换为图形并应用一些算法。

我认为您应该使用所遵循路径的内存执行一次测试。在伪代码中,它将如下所示:

DFS(matrix, path):
   /* End conditions */
   If path.last is [n-1, n-1]
      print path /* Hooray! Found a path! */
   If path.last has already been visited in path
      Discard solution
   If path.last is out of bounds (coordinates < 0 or > n-1)
      Discard solution
   If matrix[path.last] value is 0
      Discard solution

   /* We're in the middle of a path: continue exploring */
   For direction in [1, 0], [0, 1], [-1, 0], [0, -1]
      Add [path.last + direction] to path // Move north, south, east, west
      DFS(matrix, path)
      Remove last element from path

/* Call the algorithm */
DFS(matrix, [1, 1])
DFS(矩阵,路径):
/*结束条件*/
如果path.last为[n-1,n-1]
打印路径/*万岁!找到一条路*/
如果路径中已访问path.last
废弃溶液
如果path.last超出边界(坐标<0或>n-1)
废弃溶液
如果矩阵[path.last]值为0
废弃溶液
我们在一条路径中间:继续探索*/
对于[1,0]、[0,1]、-1,0]、[0,1]中的方向
将[path.last+方向]添加到路径//北、南、东、西移动
DFS(矩阵、路径)
从路径中删除最后一个元素
/*调用算法*/
DFS(矩阵[1,1])
在这个算法中,您可以传递对矩阵和路径的引用,这为您提供了一个常量内存算法(您只有一个
path
around的实例)。至于时间复杂度,这在可能路径的数量上是线性的(因为您只探索了一次每个可能路径,甚至忽略了那些路径),在长度上是二次的(因为您通过线性搜索测试每个点是否已经存在于路径中)。 请记住,路径的数量可以是
n
,路径的长度在最坏的情况下是,
n^2
。非常慢的蛮力算法

该算法的最坏情况将是一个矩阵,其中只填充了具有指数复杂性的矩阵


最佳情况是一个矩阵,在
[1,1]
[n-1,n-1]
之间只有一条可能的路径。在这种情况下,路径长度的复杂性可能介于
O(n)
O(n^2)

通过该矩阵,我至少计算了5种方式……我没有使用对角。在可解路径上有4个分支,所以应该有4个以上的解。我觉得DFS有点忌讳如果你有一种有效的方法,你会有一种有效的方法来找到图中的最长路径,从而找到哈密顿路径。我认为没有暴力你是做不到的。也许您想要计算特定长度的路径,允许同一节点被多次访问,或者计算最短路径的数量?有(更)有效的算法来解决这些问题。是否允许回溯?例如,这两条路径是否被视为不同的路径?(忽略它看起来有一个诊断……没有,我只是对线条有点马虎……)我想知道是否有任何已知的算法可以改进最坏的情况?网格中似乎有很多对称性,但仍然是分而治之的,或者动态规划似乎没有多大帮助。我知道如果宽度小于5,那么它是可能的。