рд╣рдо рдХрдХреНрд╖рд╛ рдХреЛ рдЧреНрд░рд╛рдл рдмреВрд╕реНрдЯ рдХреЗ рддрд╣рдд рдореБрдЦреМрдЯрд╛ рдХрд░рддреЗ рд╣реИрдВред рднрд╛рдЧ 2: рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛


рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛: рдмреВрд╕реНрдЯ рдХреЙрдиреНрд╕реЗрдкреНрдЯреНрд╕
рднрд╛рдЧ 1: рд╕реНрд░реЛрдд рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдмрд┐рдирд╛ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╛рд░реНрдп рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рджреНрд╡рд┐-рдЖрдпрд╛рдореА рдЦреЗрд▓ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рд╡реНрдпрд╕реНрдд рд╣реИрдВред рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдореБрдХреНрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмреВрд╕реНрдЯ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдорд╛рд░реНрдЧ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреНрд╖реЗрддреНрд░ рдПрдХ рдЧреНрд░рд╛рдл рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡рд░реНрдЧ рдХреЛ рджреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдмрдврд╝рд╛рд╡рд╛ :: рд╡рд░реНрдЯреЗрдХреНрд▓рд┐рд╕реНрдЯрдЧреНрд░рд╛рдл рдФрд░ рдмрдврд╝рд╛рд╡рд╛ :: рдЗрдВрд╕реАрдбреЗрдВрд╕рдЧреНрд░рд╛рдл ред рдЙрд╕реА рд╕рдордп, рдореИрдВ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ - рдмрд╛рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдЧреНрд░рд╛рдлрд╝ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрднреА рднреА рдЧреНрд░рд╛рдлрд╝ рдирд╣реАрдВ рдмрдиреЗрдЧрд╛ред

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрд╛рд╣рд░реА рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдПрдХ рдмрдврд╝рд╛рд╡рд╛ рдЧреНрд░рд╛рдл рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдмреЗрд╢рдХ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдЪрд▓реЛ num_vertices рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдирд╛рдо рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЧреНрд░рд╛рдл рд╡рд░реНрдЯрд┐рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЦреЗрд▓ рдореИрджрд╛рди рдХреА рд▓рдВрдмрд╛рдИ рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдЧреБрдгрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ VerticesSizeType рдЖрд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ int рд╣реИ)ред

VerticesSizeType num_vertices(const GameField& graph) { return graph.getWidth() * graph.getHeight(); } 


рдЕрдм рд╣рдо рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╣ рдЧреНрд░рд╛рдл рдХреЗ рд╕рднреА рд╢реАрд░реНрд╖реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рд╣рдо рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рдереЗ рдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХ рд╢реВрдиреНрдп рд╕реЗ num_vertices рддрдХ рджрд░реНрд╢рд╛рдП рдЬрд╛рдПрдВрдЧреЗ ред рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреЗ рд╣реИрдВ :: forward_iterator_helper ред рдпрд╣ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдореВрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ: рд╡реЗрддрди рд╡реГрджреНрдзрд┐ (++), рддреБрд▓рдирд╛ (==), рдФрд░ dereference (*) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдПрдХ рдкреВрд░реНрдг рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдЗрдЯреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реЛред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ - рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХреЛ рд╕рд╣реА рдорд╛рди рджреЗрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджреЗрдЦреЗрдВ

 class VertexIteratorImpl : public boost::forward_iterator_helper<VertexIteratorImpl, Vertex, std::ptrdiff_t, Vertex*, Vertex> { public: VertexIteratorImpl(); VertexIteratorImpl(const GameField& field, int index); void operator++ (); bool operator== (const VertexIteratorImpl& anotherIterator) const; Vertex operator*() const; private: bool isValid(); int mIndex; const GameField* mField; }; 


рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдХрд░реНрддрд╛ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНтАНрд▓реЗрдВрдЯрд░ рдХреЛ рдкреНтАНрд▓реЗрдЗрдВрдЧ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдмрд╕ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ "рдХрд╛рд░реНрдп" рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ:

 VertexIteratorImpl::VertexIteratorImpl() : mField(NULL) , mIndex(0) { } 


рджреВрд╕рд░рд╛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

 VertexIteratorImpl::VertexIteratorImpl(const GameField& field, int index) : mField(&field) , mIndex(index) { } 


isValid - рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрдЯреНрд░реЗрдЯрд░ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ (рдЧреЗрдо рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рд╣реИ, рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдПрдХ рд╡реИрдз рдлрд╝рдВрдХреНрд╢рди рд╣реИ)

 bool VertexIteratorImpl::isValid() { return (mField != NULL) && (mIndex < num_vertices(*mField)) && (mIndex >=0); } 


рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╢реАрд░реНрд╖ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ, рдФрд░ mIndex рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдирддрд╛ рдкрд░реАрдХреНрд╖рдг рд╣реИ

 bool VertexIteratorImpl::operator== (const VertexIteratorImpl& anotherIterator) const { return mIndex == anotherIterator.mIndex; } 


рдпрд╣ рд╣реИ рдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рдХреА рд╡реГрджреНрдзрд┐ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ - рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдиреБрд▓рдВрдм рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ

 void VertexIteratorImpl::operator++ () { if (isValid()) { ++mIndex; } } 


рд╢реАрд░реНрд╖ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Dereferencing рдЖрддрд╛ рд╣реИ

 Vertex VertexIteratorImpl::operator*() const { return mIndex; } 


рдЙрд╕рдХреЗ рдмрд╛рдж, рдЧреНрд░рд╛рдлрд╝ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдХреЛрдиреЗ ред рдпрд╣ рджреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдХреЛрдиреЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рдЕрдЧрд▓реЗ (рдорд╛рдирдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЕрдВрдд рдХреЗ рдПрдирд╛рд▓реЙрдЧ) рдХреЗ рдмрд╛рджред

 std::pair<VertexIterator, VertexIterator> vertices(const GameField& graph) { return std::make_pair(VertexIterator(graph, 0), VertexIterator(graph, num_vertices(graph))); } 


рд╡реЗрд░рдЯреЗрдХреНрд╕рдЯрд╛рдЗрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╣ рдЙрд░реНрдл тАЛтАЛрд╡рд░реНрдЯреЗрдХрд╛рд░реНрдЯрд░рдЗрдВрдЯрд░рдкреНрд▓ рд╣реИ)ред рдЕрдм рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдмрдврд╝рдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рдЕрдВрддрд┐рдо рд╢реАрд░реНрд╖ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред

 Vertex source(Edge edge, const GameField &graph) { return edge.first; } Vertex target(Edge edge, const GameField &graph) { return edge.second; } 


рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдХрд┐рдирд╛рд░рд╛ рдПрдХ рдЬреЛрдбрд╝реА рдХреЛрдиреЗ рд╣реИ)ред рдпрд╣ рджрд┐рдП рдЧрдП рд╢реАрд░реНрд╖ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХрд╛рдлреА рдЖрджрд┐рдо рд╣реИред рдХрд╛рд░реНрдп рдХреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо: рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ 8 рдЫреЛрд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рддреЛ рдХрд┐рдирд╛рд░реЛрдВ рд╣реИрдВ, рдпрджрд┐ рд╡реНрдпрд╕реНрдд рд╣реИрдВ, рддреЛ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

 class OutEdgeIteratorImpl : public boost::forward_iterator_helper<OutEdgeIterator, Edge, std::ptrdiff_t, Edge*, Edge> { public: OutEdgeIteratorImpl(const GameField& field, Vertex cellPosition, int index = 0); OutEdgeIteratorImpl(); Edge operator*() const; void operator++ (); bool operator== (const OutEdgeIterator& other) const; private: Vertex getCurrentPosition() const; Vertex getTargetPosition() const; void updateShift(); bool isValid(); int mShift; Vertex mCellPosition; const GameField* mField; static const int sShiftsX[8]; static const int sShiftsY[8]; }; 


sShiftsX рдФрд░ sShiftsY рдПрд░реЗ рдХреЗ рд╕рд╛рде x рдФрд░ y рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдХрдЯрд╡рд░реНрддреА рдХреЛрдиреЗ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд░реЗрдЬрд╝ рд╣реИрдВред

 const int OutEdgeIteratorImpl::sShiftsX[8] = { -1, 0, 1, -1, 1, -1, 0, 1 }; const int OutEdgeIteratorImpl::sShiftsY[8] = { 1, 1, 1, 0, 0, -1, -1, -1}; 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╡рд░реНрдЯрд┐рдХрд▓ рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдереА - рдбрд┐рдлреЙрд▓реНрдЯ рдбрд┐рдЬрд╛рдЗрдирд░ рдПрдХ рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ (рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ), рд╣рдо рдЦреБрдж рджреВрд╕рд░реЗ рдбрд┐рдЬрд╛рдЗрдирд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВрдЧреЗред

 OutEdgeIteratorImpl::OutEdgeIteratorImpl() : mField(NULL) , mCellPosition(0) , mShift(0) { } OutEdgeIteratorImpl::OutEdgeIteratorImpl(const GameField& field, Vertex cellPosition, int index/* = 0*/) : mField(&field) , mCellPosition(cellPosition) , mShift(index) { updateShift(); } 


рд╡рд░реНрдЯреЗрдХреНрд╕ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╕рднреА рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдЕрдкрдбреЗрдЯрд╢рд┐рдлреНрдЯ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдп рдЗрдЯрд░реЗрдЯрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ "рд╕реНрдХреНрд░реЙрд▓" рдХрд░реЗрдВред

 void OutEdgeIteratorImpl::operator++ () { ++mShift; updateShift(); } 

рдЧреЗрдо рдлрд╝реАрд▓реНрдб GameField :: canPass (int x, int y) рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИ (рджрд┐рдП рдЧрдП рд╕реЗрд▓ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ), рддреЛ рдЕрдЧрд▓реЗ рдкрдбрд╝реЛрд╕реА рд╕реЗрд▓ рдХреЛ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рдирд╛рд░реЗ рд╢реВрдиреНрдп рд╕реЗ рдЖрда рддрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

 void OutEdgeIteratorImpl::updateShift() { if (isValid()) { int x, y; std::tie(x, y) = getCoordinates(mCellPosition, *mField); int dx = sShiftsX[mShift]; int dy = sShiftsY[mShift]; if (!mField->canPass(x + dx, y + dy)) { ++mShift; updateShift(); } } } bool OutEdgeIteratorImpl::isValid() { return (mField != NULL) && (mShift < 8) && (mShift >=0); } 


рдЗрдЯрд░реЗрдЯрд░ рдореЗрдВ рджреЛ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рднреА рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд░реНрдЯреЗрдХреНрд╕ (рдЬреЛ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХреА рдЧрдИ рдереА) рдФрд░ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╡рди ( mShift рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ ) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИрдВред

 Vertex OutEdgeIteratorImpl::getCurrentPosition() const { return mCellPosition; } Vertex OutEdgeIteratorImpl::getTargetPosition() const { return getCurrentPosition() + sShiftsX[mShift] + mField->getWidth() * sShiftsY[mShift]; } 


рдЕрдиреБрдордВрдбрд▓ рдСрдкрд░реЗрдЯрд░ рдЗрд╕ рдЬреЛрдбрд╝реА рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 Edge OutEdgeIteratorImpl::operator*() const { return std::make_pair(getCurrentPosition(), getTargetPosition()); } 


рдмрдврд╝рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рд▓рдВрдмрд╡рдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд░рддрд╛ рд╣реИ

 bool OutEdgeIteratorImpl::operator== (const OutEdgeIteratorImpl& other) const { return mShift == other.mShift; } 


рдФрд░ рдЕрдВрддрд┐рдо рдЪрд░рдг рдмрдирд╛ рд╣реБрдЖ рд╣реИ - рдХрд┐рдирд╛рд░реЗ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдмрдирд╛рдП рдЧрдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдмрд╛рдЙрдВрдб рдПрдЬ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛

 std::pair<OutEdgeIterator, OutEdgeIterator> out_edges(Vertex v, const GameField& graph) { return std::make_pair(OutEdgeIterator(graph, v, 0), OutEdgeIterator(graph, v, 8)); } 


рдЗрдВрдбреЗрдХреНрд╕ 8 рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдВрддрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡реИрдз рдорд╛рди 0 рд╕реЗ 7 рддрдХ рд╣реИрдВ)ред рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рднреА OutEdgeIterator рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЧрдгрдирд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ

 DegreeSizeType out_degree(Vertex v, const GameField& graph) { DegreeSizeType result = 0; std::pair<OutEdgeIterator, OutEdgeIterator> edges = out_edges(v, graph); for (OutEdgeIterator i = edges.first; i != edges.second; ++i) { ++result; } return result; } 


рд╡рд╣ рд╕рдм рд╣реИред рдЕрдм рдЖрдк рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдорд╛рд░рд╛ рдЦреЗрд▓ рдореИрджрд╛рди рдПрдХ рд╕рд╛рде рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

  boost::function_requires<boost::VertexListGraphConcept<GameField> >(); boost::function_requires<boost::IncidenceGraphConcept<GameField> >(); 


рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрде рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдФрд░ рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореИрдВ рдЪрдХреНрд░ рдХреЗ рдЕрдВрддрд┐рдо рд▓реЗрдЦ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/In212089/


All Articles