#pragma once #include #include #include typedef std::pair Position; extern const int EMPTY; extern const Position UNKNOWN; std::vector> heights_to_mat(const std::vector& heights, int H); class State { public: std::vector> bay; std::vector heights; int H, W, n, max_ind; std::vector position; State(std::vector> _bay, std::vector _heights, int _H, int _max_ind); State copy() const; int top(int i) const; void move(int i, int j); void retrieve(int i); void add(int i, int x); std::pair get_position(int x) const; void print_bay(); class Ordered_State apply_order(const std::vector& order); }; class Ordered_State : public State { public: int min_container; Ordered_State(); void retrieve(int i); void add(int i, int x); bool operator==(const Ordered_State& other) const; std::string to_string() const; }; int opt(State& s); double ratios(State& ref_s, State& s, int cost, std::vector& order, Position req);