-1,+ 1的所有组合的向量矢量

时间:2016-08-22 11:44:52

标签: c++ vector combinatorics

对于任何给定的n,我需要创建一个长度为n std::vector<std::vector<int>>的向量向量,其中包含所有 -1的可能组合和+1。例如,对于n=3,我需要

std::vector<std::vector<int>> v = {
  { 1,  1,  1},
  { 1,  1, -1},
  { 1, -1,  1},
  { 1, -1, -1},
  {-1,  1,  1},
  {-1,  1, -1},
  {-1, -1,  1},
  {-1, -1, -1}
};

任何提示?

3 个答案:

答案 0 :(得分:2)

使用二进制表示的简单解决方案,并测试位值。我使用std::bitset虽然您也可以使用简单的C风格位操作。

#include <bitset>

int main(){
    int n=3;
    int to = pow(2,n);
    std::vector<std::vector<int>> result;
    for (int i=0; i < to; i++){
        std::bitset<32> b(i);
        std::vector<int> vec1;
        for (int j=0; j < n; j++){
            int value = b.test(j) ? 1 : -1;
            vec1.push_back(value);
        }
        result.push_back(vec1);
    }

    // Printing out result
    for (auto& vec : result){
        for (auto val : vec){
            cout << val;
        }
        cout << endl;
    }
}

Test Example

答案 1 :(得分:1)

对于较大的def my_view(request): request.current_app = request.resolver_match.namespace ... 值,您可能希望提高效率:

(n)

我确定有人可以提出一个模板元程序,可以在编译时为常量std::vector<std::vector<int>> v; v.reserve(1 << n); for (unsigned int i = 0; i < (1 << n); i++) { std::vector<int> vi (n, 0); for (unsigned int j = 0; j < n; j++) vi[n - 1 - j] = (i & (1 << j)) ? (-1) : (+1); v.emplace_back(vi); } 构建(v)

答案 2 :(得分:-2)

根据@ sascha的建议,这是一个将+ -1附加到给定列表集的方法。

#include <vector>
#include <iostream>

std::vector<std::vector<int>>
append_plus_minus(const std::vector<std::vector<int>> & in)
{
  auto out = in;
  out.insert(out.end(), in.begin(), in.end());
  for (std::size_t i=0; i < in.size(); i++) {
    out[i].push_back(+1);
    out[i+in.size()].push_back(-1);
  }
  return out;
}

int main() {
  const int n = 5;

  std::vector<std::vector<int>> b_combinations = {{}};
  for (std::size_t i=0; i < n; i++) {
    b_combinations = append_plus_minus(b_combinations);
  }

  for (std::size_t i=0; i < b_combinations.size(); i++) {
     for (std::size_t j=0; j < b_combinations[i].size(); j++) {
       std::cout << b_combinations[i][j] << " ";
     }
     std::cout << std::endl;
  }
  return 0;
}