1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
#include <cmath>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <memory>
#include <vector>
#ifndef CLASS_FLOE_HPP
#define CLASS_FLOE_HPP
struct Floe {
int x {}
, y {}
, penguins_on_floe {}
, max_jumps {}
, cur_jumps {};
bool is_input_node { true };
std::vector<int> edges;
std::shared_ptr<Floe> parent;
//friend:
friend std::ostream& operator << ( std::ostream& os, const Floe& rhs);
};
#endif // CLASS_FLOE_HPP
std::ostream& operator << ( std::ostream& os, const Floe& rhs)
{
os << "pos: (" << rhs.x << ", " << rhs.y << ")"
<< "; penguins: " << rhs.penguins_on_floe
<< "; max j: " << rhs.max_jumps
<< "; curr j: " << rhs.cur_jumps
<< "; input? " << std::boolalpha << rhs.is_input_node
<< "; parent: " << rhs.parent.get()
<< "; --> ";
for ( int i : rhs.edges ) {
os << i << ", ";
}
return os;
}
int linkNodes(double max_jump);
std::vector<Floe> fillVectorWithMagicValues();
void printFloes(const std::vector<Floe>& v);
int main()
{
linkNodes( 66.6 ); // arbitrary magic number
}
int linkNodes(double max_jump)
{
auto floes { fillVectorWithMagicValues() } ;
printFloes(floes);
for ( auto odds { std::next( floes.begin() ) };
odds <= floes.end();
std::advance(odds, 2) )
{
std::cout << "odds now: " << *odds << '\n';
int x = odds->x;
int y = odds->y;
for ( auto evens { floes.begin() };
evens <= std::prev( floes.end() );
std::advance(evens, 2) )
{
std::cout << "evens now: " << *evens << '\n';
if ( std::pow(x - (evens->x), 2)
+ std::pow(y - (evens->y), 2)
<= max_jump )
{
odds->edges.push_back( evens - floes.begin() );
}
}
}
printFloes(floes);
return 0;
}
std::vector<Floe> fillVectorWithMagicValues()
{
// x, y, penguins_on_floe, max_jumps, cur_jumps, is_input_node, edges, parent
// Note: let's use cur_jumps to teel them apart:
std::vector<Floe> v {
{ 1, 1, 13, 666, 0, false, {}, nullptr },
{ 1, 1, 13, 666, 1, false, {}, nullptr },
{ 2, 3, 13, 666, 2, false, {}, nullptr },
{ 2, 3, 13, 666, 3, false, {}, nullptr },
{ 3, 5, 13, 666, 4, false, {}, nullptr },
{ 3, 5, 13, 666, 5, false, {}, nullptr },
{ 5, 1, 13, 666, 6, false, {}, nullptr },
{ 5, 1, 13, 666, 7, false, {}, nullptr },
{ 5, 4, 13, 666, 8, false, {}, nullptr },
{ 5, 4, 13, 666, 9, false, {}, nullptr }
};
return v;
}
void printFloes(const std::vector<Floe>& v)
{
for ( const auto& e : v ) {
std::cout << e << '\n';
}
std::cout << '\n';
}
|