遍历从(0,0,0)到(5,5,5)的所有路径

时间:2012-10-19 03:16:09

标签: algorithm iteration sequential

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

这就是我想做的事情:

我有一个包含几种可能状态的项目列表。为简单起见,让我们调用项目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

此类任务是否有名称或通用程序?不一定寻找直接答案(会是奖金),但至少有一些关键词,所以我可以更有效地搜索!

提前致谢。

2 个答案:

答案 0 :(得分:2)

使用五个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;
}

答案 1 :(得分:1)

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

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)
    })
  }
}