C++. Brute forced recursion working a solution that prevents the duplicated (180 degree rotations from appearing). I can't use bitwise operators well enough. Would love a critique of my pointer use (first time using them).
#include <iostream>
#include <vector>
#include <algorithm>
bool has_dup(std::vector<int> *v, int val)
{
for (int i = 0; i < v->size(); i +=1)
if ((*v)[i] == val)
return true;
return false;
}
bool check_valid(std::vector<int> ruler)
{
std::vector<int> check;
for (int i = 0; i < ruler.size()-1; i += 1)
{
for (int j = i+1; j < ruler.size(); j += 1)
{
std::vector<int> *p = ✓
if ( has_dup(p, ruler[j] - ruler[i]))
return false;
else
check.push_back(ruler[j] - ruler[i]);
}
}
return true;
}
void recurse(int level, std::vector<int> ruler, bool * p_found, std::vector< std::vector<int> > * p_options)
{
if (level < ruler.size()-1)
{
for (int i = ruler[level-1]+1; i < ruler[ruler.size()-1]; i += 1)
{
ruler[level] = i;
recurse(level + 1, ruler, p_found, p_options);
}
}
else if (check_valid(ruler))
{
*p_found = true;
p_options->push_back(ruler);
}
}
void display(std::vector<int> ruler)
{
for (int i = 0; i < ruler.size(); i+=1)
std::cout << ruler[i] << " ";
std::cout << "\n";
}
void generate_ruler(int len)
{
int max = len;
bool found = false;
std::vector< std::vector<int> > options;
std::vector< std::vector<int> > * p_o = &options;
while (!found)
{
std::vector<int> ruler (len, 0);
ruler[ruler.size()-1] = max;
bool *p_f = &found;
recurse(1, ruler, p_f, p_o);
max += 1;
}
std::cout << max-1 << "\n";
for_each(options.begin(), options.end(), display);
}
int main()
{
int len;
std::cin >> len;
generate_ruler(len);
return 0;
}