【发布时间】:2015-02-19 17:22:13
【问题描述】:
一个机器人坐在 NxN 网格的左上角。机器人只能向两个方向移动:向右和向下,其中一些单元格已死,即机器人无法进入该单元格。机器人有多少条可能的路径?
这可以使用回溯解决,但它的时间复杂度太高。我已经使用回溯解决了这个问题,但在最坏的情况下需要 O(2^n)。
bool exist(bool a[][], int i, int j,int N){
return i>=0 && j >=0 && i < N && j < N;
}
int search(bool a[][], int i, int j,int N){
if(!exist(a,i,j,N) || a[i][j] == 1)
return 0; // no path here.
if(i == N-1 && j == N - 1){
return 1; // 1 path here.
}
a[i][j] = 1; // mark that we have seen this spot here
int paths = 0; // introduce a counter...
paths += search(a, i,j+1,N); // add the additional paths as we find them
paths += search(a, i+1,j,N);
a[i][j] = 0;
return paths; // return the number of paths available from this point.
}
这里的单元格为 1 表示死单元格。有什么方法可以通过使用 DFS 或动态规划等来降低时间复杂度?
【问题讨论】:
-
还有什么问题?
-
降低时间复杂度...
-
这不是一个问题...
标签: c++ algorithm dynamic-programming depth-first-search backtracking