4 #include <ext/hash_map>
9 // These are needed to be able to use std::string as key in a hash_map.
11 template< typename CharT, typename Traits, typename Alloc >
12 struct hash< std::basic_string<CharT, Traits, Alloc> > {
13 size_t operator()(const std::basic_string<CharT, Traits, Alloc>& s) const {
15 const std::collate<CharT>& c = std::use_facet< std::collate<CharT> >(std::locale());
17 return c.hash(s.c_str(), s.c_str() + s.size());
23 template< typename CharT, typename Traits, typename Alloc >
24 struct hash< const std::basic_string<CharT, Traits, Alloc> > { //yes you need this version aswell!
26 size_t operator()(const std::basic_string<CharT, Traits, Alloc>& s) const {
28 const std::collate<CharT>& c = std::use_facet< std::collate<CharT> >(std::locale());
30 return c.hash(s.c_str(), s.c_str() + s.size());
36 enum StreetType{foot, car, both};
37 enum PlayerType{robber, cop_foot, cop_car};
38 enum IntersectionType{hq, bank, robber_start, ordinary};
41 __gnu_cxx::hash_map<std::string,StreetType> connections;
42 IntersectionType type;
58 T value(std::string input);
69 Bot(const std::string& name, PlayerType type);
77 virtual std::string turn();
78 virtual void preGamePreparations(){};
79 virtual void move(std::string location);
80 virtual void sendInformation();
81 virtual void getInformation();
82 virtual void sendPlan();
83 virtual void getPlans();
85 virtual void voteResult();
88 std::list<std::string> shortestPath(const std::string& from, PlayerType type, const Goal& goal, bool reverse = false);
90 __gnu_cxx::hash_map<std::string, Intersection> _intersections;
91 __gnu_cxx::hash_map<std::string, Player> _players;
92 __gnu_cxx::hash_map<std::string, int> _banks;
93 std::map<int, std::string> _evidence;
94 std::map<PlayerType, std::string> _playerTypeNames;
95 std::map<std::string, PlayerType> _playerTypes;
98 std::string _location;
102 std::string _robberLocation;
104 __gnu_cxx::hash_map<std::string, int> _winningPlans;
111 SimpleSPGoal(const std::string& to, int limit = 0):_to(to), _limit(limit){
113 inline int operator()(const SPInfo* node) const{
114 if (_limit > 0 && node->cost >= _limit)
116 if (node->name == _to)
125 const __gnu_cxx::hash_map<std::string, Player>& _players;
128 FindPlayer(const __gnu_cxx::hash_map<std::string, Player>& players, PlayerType type, int limit = 0): _players(players), _type(type), _limit(limit){
130 inline int operator()(const SPInfo* node) const{
131 if (_limit > 0 && node->cost >= _limit)
133 for(__gnu_cxx::hash_map<std::string, Player>::const_iterator player = _players.begin();
134 player != _players.end(); ++player){
135 if (player->second.type == _type && player->second.location == node->name){
145 inline bool operator()(const SPInfo* v1, const SPInfo* v2){
146 return v1->cost > v2->cost;