【问题标题】:Iterate through all paths from (0,0,0) to (5,5,5)遍历从 (0,0,0) 到 (5,5,5) 的所有路径
【发布时间】:2012-10-09 15:10:55
【问题描述】:

我确定我想要实现的目标有一个名称或方法,但是您可以从这个问题有点模糊的标题判断,我只是不知道如何措辞,因此遇到了麻烦搜索。

这是我想做的:

我有一个包含几种可能状态的项目列表。为简单起见,我们称项目 A、B 和 C 以及状态 0 到 5。

每个项目的状态在每个步骤中只能增加 1。每一步只能增加一项。每个场景A、B和C开始时都是0。每个场景A结束时,B和C都是5。

这将是最明显场景的一个示例。所有场景的步数都相同。

A 0 1 2 3 4 5 5 5 5 5 5 5 5 5 5 5 
B 0 0 0 0 0 0 1 2 3 4 5 5 5 5 5 5 
C 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 

我想遍历每一个可能的“决策路径”。我在每一步都有计算要执行,我有每个场景的值要比较以确定哪个更好。以防万一还不清楚,这是一个完全随机场景的示例,但最终将使用所需的算法运行。

A 0 0 0 0 0 0 1 1 2 3 4 5 5 5 5 5
B 0 1 2 2 3 3 3 4 4 4 4 4 4 4 5 5
C 0 0 0 1 1 2 2 2 2 2 2 2 3 4 4 5

这类任务有名称或通用程序吗?不一定要寻找直接答案(将是一个奖励),但至少有一些关键词,以便我可以更有效地搜索!

提前致谢。

【问题讨论】:

    标签: algorithm iteration sequential


    【解决方案1】:

    用五个0、五个1 和五个2 枚举所有可能的长度为15 的单词。 0 代表A 增加,1 代表B 增加,2 代表C 增加。

    #include<algorithm>
    #include<vector>
    #include<iostream>
    using namespace std;
    int main(){
      int n=5;
      vector<int> u(3),v(3*n);
      for (int i = 0; i < n; i++){
        v[i] = 0; v[i+n] = 1; v[i+2*n] = 2;
      }
      do
      {
        fill(u.begin(),u.end(),0);
        for (int j = 0; j < 3*n; j++){
          for (int i = 0; i < 3; i++)
            cout << u[i] << "\t";
          cout << endl;
          u[v[j]]++;
        }
        for (int i = 0; i < 3; i++)
          cout << u[i] << "\t";
        cout << endl;
        cout << endl;
      } while (next_permutation(v.begin(),v.end()));
      return 0;
    }
    

    【讨论】:

    • 谢谢,这似乎运作良好。我会尝试让它适用于我的特定应用程序。
    【解决方案2】:

    您可以将 2D 案例视为二项式系数 - 想象一个矩形,您试图从左下角到右上角而不是向左或向下。您可以通过Pascal's triangle 实现计数。这是一张来自维基百科的图片:

    事实上,这可以推广到多项式,它使用Pascal's simplex

    您可以递归地解决这个问题(在伪代码中):

    go( a: List, list: List ) = {
      if (a.forall(_ == 0)) {
        // do magic on list
      } else {
        a.zip(1 to a.size).foreach( (number,index) => if (number > 0 ) {
          go(a.patch(index-1,Seq(number-1),1), list ++ index)
        })
      }
    }
    

    【讨论】:

    • 感谢您的回复。不幸的是,我对伪代码有点迷失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多