X-Git-Url: https://ruin.nu/git/?p=icfp05.git;a=blobdiff_plain;f=robber%2Frobber.cpp;h=dbb287a4d760b5bb2dd231497778866318fb24a4;hp=0e0a265a1e26daaf0fd6da99f0d2126922a9ed88;hb=d7d9942fc9d1066670e166182e36791dfbf035d7;hpb=3a975985ae3a8b2b1cc34df85bc81186afa43842 diff --git a/robber/robber.cpp b/robber/robber.cpp index 0e0a265..dbb287a 100644 --- a/robber/robber.cpp +++ b/robber/robber.cpp @@ -1,29 +1,12 @@ #include "robber.h" #include #include +#include #include using namespace std; using namespace __gnu_cxx; -struct FindPlayer : SPGoal{ - int _limit; - const hash_map& _players; - PlayerType _type; - FindPlayer(const hash_map& players, PlayerType type, int limit = 0) : _players(players), _type(type), _limit(limit){} - int operator()(const SPInfo* node) const{ - if (_limit > 0 && node->cost >= _limit) - return -1; - for(hash_map::const_iterator player = _players.begin(); - player != _players.end(); ++player){ - if (player->second.type == _type && player->second.location == node->name){ - return 1; - } - } - return 0; - } -}; - string Robber::turn(){ hash_map streets; Intersection& inter = _intersections[_location]; @@ -36,8 +19,8 @@ string Robber::turn(){ double goodness = 0; Intersection& conInter = _intersections[street->first]; - list closestFootCop = shortestPath(street->first, cop_foot, FindPlayer(_players, cop_foot, 6)); - list closestCarCop = shortestPath(street->first, cop_car, FindPlayer(_players, cop_car, 5)); + list closestFootCop = shortestPath(street->first, cop_foot, FindPlayer(_players, cop_foot, 6), true); + list closestCarCop = shortestPath(street->first, cop_car, FindPlayer(_players, cop_car, 5), true); unsigned int closestCop = 0; bool copInCar = false; @@ -53,7 +36,7 @@ string Robber::turn(){ continue; } - vector banks; + priority_queue banks; for(hash_map::const_iterator bank = _banks.begin(); bank != _banks.end(); ++bank){ //cerr << "Handling bank at: " << bank->first << endl; @@ -63,13 +46,15 @@ string Robber::turn(){ continue; //list::iterator i = l.begin(); //++i; - banks.push_back(bank->second/(pow(l.size(),4.0))); + banks.push(bank->second/(pow(l.size(),4.0))); } } - sort(banks.begin(),banks.end(),greater()); + //sort(banks.begin(),banks.end(),greater()); - for (unsigned int i = 0; i < 2 && i < banks.size();++i) - goodness += banks[i]; + for (unsigned int i = 0; i < 2 && banks.size() > 0;++i){ + goodness += banks.top(); + banks.pop(); + } cerr << "Goodness before cop: " << goodness << endl; if (closestCop > 2){