【问题标题】:Counting total Paths from (0,0) to (n-1,n-1) in a n*n grid在 n*n 网格中计算从 (0,0) 到 (n-1,n-1) 的总路径
【发布时间】:2015-07-05 14:18:11
【问题描述】:

我正在使用一个简单的回溯算法来查找所有路径,但它没有给出正确的答案。我无法弄清楚错误。我们可以从给定位置上下左右移动。

    Int path(int a[][200],int n,int m,int r,int c) 
    {
        if(n == r - 1 && m == c-1) {
            return 1;
        }
        else if(n >= r || m >= c || n < 0 || m < 0) {
            return 0;
        }
        else if(vis[n][m] == 1) {
            return 0;
        }
        else {
            vis[n][m] = 1;
            int x = path(a,n+1,m,r,c);
            int y = path(a,n,m+1,r,c);
            int u = path(a,n-1,m,r,c);
            int v = path(a,n,m-1,r,c);
            vis[n][m] = 0;
            return (x+y+u+v);
        }
}

【问题讨论】:

  • 为什么要写程序统计路径总数?只是 (2n!) / (n!)^2,不是吗?
  • 你可以向上和向左移动,还是只能向右和向下移动(通常是这样问的问题)?
  • 我的排列组合没那么强。
  • 只有上下还是四个方向?
  • 查看2n choose n的方法是要弄清楚你总共要走2n步(n下,n右),并且在你选择的那些中n 往下走,另一个n 你往右边走。

标签: c++ algorithm backtracking


【解决方案1】:

找到路径计算路径并不是一回事。我假设您只想计算路径(因为您的问题的标题),并且您只能向右移动向下移动

为此,您实际上并不需要矩阵(表示网格)作为参数。以下是一个简单(虽然效率不高)的递归解决方案,也适用于 n*m 网格:

int countPaths(int m, int n) {
    if (m == 0 || n == 0)
        return 1;

    return countPaths(m-1, n) + countPaths(m, n-1); 
}

一般n*n网格的数学解为:

(2n choose n) = (2*n)!/(n!*n!)

然后,将结果与公式进行比较:

countPaths(1, 1) == 2   // (2*1)!/(1!*1!)=2

countPaths(2, 2) == 6   // (2*2)!/(2!*2!)=6

countPaths(3, 3) == 20  // (2*3)!/(3!*3!)=20

您的回溯方法将产生相同的结果,但需要考虑一些因素。例如,考虑n=2 时,您将需要一个 3x3 矩阵(通常是(n+1)x(n+1) 矩阵)来表示/探索(并用 1 标记)2x2 网格的所有路径:

int countPaths(int a[][3],int n, int m, int r, int c) {
        if(n == r-1 && m == c-1) {
            return 1;
        }
        else if(n >= r || m >= c || n < 0 || m < 0) {
            return 0;
        }
        else if(vis[n][m] == 1) {
            return 0;
        }
        else {
            vis[n][m] = 1;
            int x = countPaths(a,n+1,m,r,c);
            int y = countPaths(a,n,m+1,r,c);
            vis[n][m] = 0;
            return (x+y);
        }
} 

然后:

countPaths(vis, 0, 0, 3, 3) == 6  // (2*2)!/(2!*2!)=6

【讨论】:

  • 这根本不能回答问题。
猜你喜欢
  • 2015-01-31
  • 2020-04-21
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
相关资源
最近更新 更多