'for'循环用于组合组合

时间:2013-06-06 06:43:31

标签: c++ algorithm for-loop

我在c ++中有一个带有未知条目的数组(最少6个)我需要一个for循环(可能包括一些for循环),这使得3组为2.我不关心组的顺序或者在组。棘手的部分是不允许重复计算。我试过这样的事情,但显然是三重计算......

for(int i = 0; i < nArray - 1; i++)
{
  for(int j = i+1; j < nArray; j++)
  {
    for(int k = 0; k < nArray - 1; k++)
    {
      for(int l = k+1; l < nArray; l++)
      {
        for(int m = 0; m < nArray - 1; m++)
        {
          for(int n = m+1; n < nArray; n++)
          {
            if(k!=i && k!=j && l!=i && l!=j && m!=i && m!=j && n!=i && n!=j && m!=k && m!=l && n!=k && n!=l)
            {
              std::cout << array[i] << "-" << array[j] << std::endl  << array[k] << "-" << array[l] << std::endl << array[m] << "-" << array[n] << std::endl << std::endl;
            }
          }
        }
      }
    }
  }
}

编辑:例如,让我们的数组是{1,2,3,4,5,6},它有6个条目。输出应如下所示:

 12-34-56
 12-35-46
 12-36-45
 13-24-56
 13-25-46
 13-26-45
 14-23-56
 14-25-36
 14-26-35
 15-23-46
 15-24-36
 15-26-34
 16-23-45
 16-24-35
 16-25-34

但是因为有12-34-56,所以不应该有12-43-56或34-12-56。

对于数组{1,2,3,4,5,6,7}

12-34-56
12-34-57
12-34-67
12-35-46
12-35-47
12-35-67
...

等等。

2 个答案:

答案 0 :(得分:2)

递归递增。从数组中选择两个元素以形成一对,从数组中删除它们并在简化数组上调用相同的函数。这样你只有两个嵌套循环,你将覆盖整个数组。

或者,使用带有信息的附加数组,已使用哪些元素而不是从原始数组中删除它们。

void GeneratePairs(std::vector<int> & values, std::vector<bool> & used, std::vector<std::pair<int, int>> & results)
{
    int i = 0;
    while (i < values.size() && used[i])
        i++;

    if (i != values.size())
    {
        used[i] = true;

        for (int j = i + 1; j < values.size(); j++)
        {
            if (!used[j])
            {
                used[j] = true;

                std::pair<int, int> tmp(values[i], values[j]);
                results.push_back(tmp);

                GeneratePairs(values, used, results);

                results.pop_back();

                used[j] = false;
            }
        }

        used[i] = false;
    }
    else
    {
        for (int i = 0; i < results.size(); i++)
        {
            printf("%d,%d", results[i].first, results[i].second);
            if (i < results.size() - 1)
                printf("-");
        }
        printf("\n");
    }
}

// (...)
int main(int argc, char * argv)
{
    std::vector<int> input;
    input.push_back(1);
    input.push_back(2);
    input.push_back(3);
    input.push_back(4);
    input.push_back(5);
    input.push_back(6);

    std::vector<bool> used;
    for (int i = 0; i < input.size(); i++)
        used.push_back(false);

    std::vector<std::pair<int, int>> results;

    GeneratePairs(input, used, results);

    getchar();
}

答案 1 :(得分:0)

我只想提一下我已经找到解决这个问题的简单细节:

for(int i=0;i<input.size();i++)
{
  for(int j=i+1;j<input.size();j++)
  {
    for(int k=i+1;k<input.size();k++)
    {
      for(int l=k+1;l<input.size();l++)
      {
        if(  j==k || j==l) continue;
        for(int m=k+1;m<input.size();m++)
        {
          for(int n=m+1;n<input.size();n++)
          {
            if( m==j ||  m==l || n==j  || n==l) continue;
            std::cout << input[i] << input[j] << "-" << input[k] << input[l] <<  "-" << input[m] << input[n] << std::endl;
          }
        }
      }
    }
  }
}