[08-21-2015] Challenge #228 [Hard] Golomb Rulers

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 = &check;
         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;
}
/r/dailyprogrammer Thread