рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛: рдмреВрд╕реНрдЯ рдХреЙрдиреНрд╕реЗрдкреНрдЯреНрд╕рднрд╛рдЧ 1: рд╕реНрд░реЛрдд рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдмрд┐рдирд╛ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛рднрд╛рдЧ 2: рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдПрдХ рд╕реЗрд▓реБрд▓рд░ рдкреНрд▓реЗрдЗрдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд░реЗрдЦрд╛рдВрдХрди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╕рдм рдХреНрдпрд╛ рдерд╛ - рд╕реЗрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдорд╛рд░реНрдЧ рдХреА рдЦреЛрдЬред рдмреВрд╕реНрдЯ рд╕рд░реНрдЪ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЖрдкрдХреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдВрдЧреЗ - рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рд╡рд┐рднрд┐рдиреНрди рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗред рдПрдЬ рд╡реЗрдЯ рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ
ReadablePropertyMapConcept рдХреА
рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдСрдкрд░реЗрдЯрд░ [], рдЬреЛ рдХрд┐ рдХреА-рдПрдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдкрдиреА рд▓рдВрдмрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЧрдгрдирд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рд╣рдо рд╕рднреА рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд▓реЗрддреЗ рд╣реИрдВред
struct EdgeWeightMap { typedef double value_type; typedef value_type reference; typedef Edge key_type; typedef boost::readable_property_map_tag category; reference operator[](key_type e) const { return 1; } };
рдЯрд╛рдЗрдкрдбрд┐рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ (рдПрдЬ), рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдбрдмрд▓) рдФрд░ рд▓реЗрдмрд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмреВрд╕реНрдЯ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдорд╛рди рдореИрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдмреВрд╕реНрдЯ :: readable_property_map_tag)ред
рдмрдврд╝рдд рдФрд░ рдЕрдиреНрдп рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░
рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд
рдХрд┐рдП рдЧрдП рд╣реИрдВ ред
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЫреЛрдЯреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ (рдЕрдкрдиреЗ рд▓рд┐рдП)
typedef boost::property_map<GameField, boost::edge_weight_t>::const_type EdgeWeightMapConst; typedef boost::property_traits<EdgeWeightMapConst>::reference EdgeWeightMapValueType; typedef boost::property_traits<EdgeWeightMapConst>::key_type EdgeWeightMapKey;
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдВрдЬреА рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
EdgeWeightMapValueType get(EdgeWeightMapConst pMap, EdgeWeightMapKey pKey) { return pMap[pKey]; }
рдЕрдм рдЖрдк рдкрд╕рд▓рд┐рдпреЛрдВ рдХреЗ рд╡рдЬрди рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдШреЛрд╖рдгрд╛ рдХреЛ рдмреВрд╕реНрдЯ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
namespace boost { template<> struct property_map< GameField, edge_weight_t > { typedef EdgeWeightMap type; typedef EdgeWeightMap const_type; }; }
рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЬрд╛рдБрдЪ
boost::function_requires<boost::ReadablePropertyMapConcept<EdgeWeightMap, Edge> >();
рдЖрдк рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЗ рдЧреБрдг рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯрдм рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдмрдврд╝рд╛рд╡рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╡рд░реНрдЯреЗрдХреНрд╕ рдЧреБрдгреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдЗрд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рджреЗрдВ
namespace boost { template <> struct vertex_property_type<GameField> { typedef boost::graph_traits<GameField>::vertex_descriptor type; }; }
рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдмреВрд╕реНрдЯ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рд╣рдо рдПрдХ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЧреНрд░рд╛рдл рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ -
рдкрдардиреАрдпрдкреНрд░рдХреНрд░рд┐рдпрд╛рдЧреНрд░рд╛рдлрдХрдВрд╕реЗрдкреНрдЯ , рдЕрд░реНрдерд╛рддред "рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдлрд╝ред" рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рджреЛ рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдПрдХ рдЧреНрд░рд╛рдл рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рддрд╛ рд╣реИ
EdgeWeightMapConst get(boost::edge_weight_t, const GameField& graph) { return EdgeWeightMapConst(); }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╡рдЬрди рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ (1 рдХреЗ рдмрд░рд╛рдмрд░), рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреНрд░рдорд╢рдГ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рд╕реВрдЪрдХ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░
рдЧреНрд░рд╛рдлрд╝ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдПрдХ рдмрдврд╝рдд рдХреЗ рд╡рдЬрди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
EdgeWeightMapValueType get(boost::edge_weight_t tag, const GameField& g, EdgeWeightMapKey e) { return get(tag, g)[e]; }
рдЗрд╕ рдкрд░ рдЕрдЧрд▓реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
boost::function_requires<boost::ReadablePropertyGraphConcept<GameField, Edge, boost::edge_weight_t> >();
рдкрде рдП рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рд╕реВрдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд
рд╣реИ , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ (рдФрд░) рдорджрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрдиреБрдорд╛рдиреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЦреЛрдЬ рдХреА рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рджрд┐рд╢рд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╣реНрдпреВрд░рд┐рд╕реНрдЯрд┐рдХ рдПрдХ
рдлрд╝рдирдХрд╛рд░ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╢рд┐рдЦрд░ рд▓рдХреНрд╖реНрдп рд╕реЗ рдХрд┐рддрдиреА рджреВрд░ рд╣реИред
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред class GameFieldHeuristic: public boost::astar_heuristic<GameField, int> { public: GameFieldHeuristic(const GameField& gameField, Vertex goal) : mGameField(&gameField) { std::pair<int, int> goalPosition = getCoordinates(goal, gameField); mGoalX = goalPosition.first; mGoalY = goalPosition.second; }; int operator()(Vertex v) { std::pair<int, int> position = getCoordinates(v, *mGameField); int dx = mGoalX - position.first; int dy = mGoalY - position.second; int result =dx * dx + dy * dy; return result; } private: int mGoalX; int mGoalY; const GameField* mGameField; };
рд╡рд░реНрдЧ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рд╢реАрд░реНрд╖ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢реАрд░реНрд╖ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ (
рд▓реЗрдЦ рдХреЗ
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП, рджреВрд░реА рдХреЛ рдмрдврд╝рд╛рдирд╛ рдпрд╛ рдШрдЯрд╛рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рд╕рдЯреАрдХ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреВрд░реА рдХреЗ рд╡рд░реНрдЧ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ (рд╕реВрддреНрд░ рдореЗрдВ рд╡рд░реНрдЧрдореВрд▓ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рдкрд╛рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдПрдХ
рдлрд╛рдЙрдВрдбрд╣рд╛рдЙрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдмрдврд╝рд╛рдХрд░
рд╕рдВрдХреЗрдд рджреЗрдВрдЧреЗред
struct FoundGoal {};
рдЖрдЗрдП рдПрдХ рд╡рд┐рдЬрд┐рдЯрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдХреА рд╡рд┐рдзрд┐
check_vertex рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рддрдХ рдкрд╣реБрдБрдЪ рдЪреБрдХрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╣рдо рд▓рдХреНрд╖реНрдп рд╢рд┐рдЦрд░ рдкрд░ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдЕрдкрд╡рд╛рдж рдмрдврд╝рд╛ рджреЗрддреЗ рд╣реИрдВ
struct AstarGoalVisitor : public boost::default_astar_visitor { AstarGoalVisitor(Vertex goal) : mGoal(goal) { } void examine_vertex(Vertex u, const GameField&) { if (u == mGoal) { throw FoundGoal(); } } private: Vertex mGoal; };
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдкрде рдЦреЛрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕реНрд░реЛрдд рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмреЛрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА
typedef std::list<NextStep> StepsList; StepsList findPath(int sourceX, int sourceY, int targetX, int targetY, const GameFieldMap& graph) { GraphVertex source = getVertex(sourceX, sourceY, graph); GraphVertex destination = getVertex(targetX, targetY, graph); std::vector<GraphVertex> predecessor(num_vertices(graph)); std::vector<edge_weight_map_value_type> dist(num_vertices(graph)); StepsList result; try { astar_search(graph, source, GameFieldHeuristic(graph, destination), boost::visitor(AstarGoalVisitor(destination)). predecessor_map(&predecessor[0]). distance_map(&dist[0])); } catch (FoundGoal f) { for (int i = destination; i != source; i = predecessor[i]) { std::pair<int, int> coordinates = getCoordinates(i, graph); result.push_front(NextStep(coordinates.first, coordinates.second)); } } return result; }
рдлрд╝рдВрдХреНрд╢рди, рдкреВрд░реНрдгрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдореЗрдВ рдХреЛрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдПрдХ
рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдФрд░ рджреВрд░реА рд╡реЗрдХреНрдЯрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд╣реАрдВ рд░реЛрдХреВрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
astar_search рдЦреЛрдЬ
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓
рдХрд░рдирд╛ ред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЪрд▓рддреЗ рд╣реИрдВ: рдЧреНрд░рд╛рдл, рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ, рд╣реЗрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдирд┐рд░реНрдорд╛рдг рдХреЙрдорд╛ рдХреЗ рдмрдЬрд╛рдп рдбреЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдИ рдЯрд╛рдЗрдкреЛ рдирд╣реАрдВ рд╣реИред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП, рдмреВрд╕реНрдЯ рдирд╛рдорд╛рдВрдХрд┐рдд рддрд░реНрдХ (рддрд╛рдХрд┐ рднреНрд░рдорд┐рдд рди рд╣реЛ) рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдкрдиреА рдкрджреНрдзрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддрдВрддреНрд░ рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд▓реЗрдЦ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдмрд╕ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВред
- рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдирд╛рдо рдмреВрд╕реНрдЯ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдмрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
- рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдХреЛрд╖реНрдардХ рдореЗрдВ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рдмрд┐рдВрджреБ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдХреНрд░рдо рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЕрдЧрд░ рд╣рдо рдкрдХрдбрд╝ рдореЗрдВ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╡реЗрдХреНрдЯрд░ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ
рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╡реЗрдХреНрдЯрд░ рдореЗрдВ
рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкреВрд░реНрд╡рд╡рд░реНрддреА [рдХреНрд░рд┐рдпрд╛] рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╢реАрд░реНрд╖ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рд╢реАрд░реНрд╖ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдХреЗ рдКрдкрд░ рдЬрд╛рдиреЗ рд╕реЗ, рдЖрдк рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рддрд░реАрдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреНрд░рдо рдХрд╛ рдПрдХ рдХреНрд░рдо рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдмрд┐рдВрджреБ рдП рд╕реЗ рдмрд┐рдВрджреБ рдмреА рддрдХ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рд╕реВрдЪреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред