【问题标题】:Counting / Printing Path - From (1,1) to (m, n)计数/打印路径 - 从 (1,1) 到 (m, n)
【发布时间】:2014-11-25 00:48:23
【问题描述】:

我想计算并打印从矩阵左下角到参数中给定目标的所有可能路径。您总是从坐标 (1,1) 开始,并且必须向上或向右移动。但是,目的地是通过参数传递的。例如:CountPath(3, 4)

我已经正确地找到了路径的数量,但发现我必须从我的目标开始并移动到开始,因为输入是目标位置。

int CountPath ( int row, int column )
{
   if ( row == 1 || column == 1 )
      return 1;
   else
      return CountPath(row - 1, column) + CountPath(row, column - 1);
}

输入/输出示例: 输入:3 4 输出:路径数为 10

void main()
{
   int m, n;
   cin >> m >> n;
   cout << "The # of paths is " << CountPath( m, n ) << endl;
}

我需要澄清一下我是否正确地执行了此操作,或者是否有办法实际从 (1,1) 开始并向上和向右移动。打印应显示所有可能的路径,例如:

(1,1)-->(2,1)-->(3,1)-->(3,2)-->(3,3)-->(3,4)
(1,1)-->(2,1)-->(2,2)-->(3,2)-->(3,3)-->(3,4)
...

那么,根据这些规则,我可以从 (1,1) 开始并向上和向右移动吗?如果没有,那我怎么按上面的顺序打印呢?

【问题讨论】:

    标签: c++ recursion matrix path-finding


    【解决方案1】:

    原因在于您实现CountPath 函数的方式。在if 语句中,您检查起始坐标,因为它们是最终的,在递归调用中,您减少坐标而不是增加坐标。这应该按您期望的方式工作:

    int CountPath ( int row, int column, int maxRow, int maxColumn)
    {
       if ( row == maxRow || column == maxColumn )
          return 1;
       else
          return CountPath(row + 1, column, maxRow, maxColumn) + CountPath(row, column + 1, maxRow, maxColumn);
    }
    

    现在你实际使用它的方式,也做了一点点修改:

    void main()
    {
       int m, n;
       cin >> m >> n;
       cout << "The # of paths is " << CountPath( 1, 1, m, n ) << endl;
    }
    

    【讨论】:

    • 我仅限于我获得的 main() 函数。我无法改变它,这就是我在我想到的几乎所有解决方案中遇到麻烦的地方。这就是为什么我什至想知道是否可以从 (1,1) 到 (m, n) 实现它,反之亦然。
    • 你可以创建一个只有两个参数的虚拟函数CountPath,它调用(并返回)你的真实函数,例如,我们称之为RealCountPath。应该可以解决您的问题:)
    • 除了main()和CountPath,你能想到任何可能的解决方案吗?
    • 您可以按照@bertmoog 的建议进行操作-首先进行递归调用,然后实际访问该字段(在这个简单示例中代码几乎相同,您只需要查看以不同的方式)。
    猜你喜欢
    • 2018-09-04
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多