X-Git-Url: https://ruin.nu/git/?p=icfp05.git;a=blobdiff_plain;f=robber%2Frobber.cpp;h=dbb287a4d760b5bb2dd231497778866318fb24a4;hp=8a11defe6862b6616967fe11269f2924bccb58ad;hb=d7d9942fc9d1066670e166182e36791dfbf035d7;hpb=0fbd9bca7cd5cd937f306753f895cfe642dd9e6d diff --git a/robber/robber.cpp b/robber/robber.cpp index 8a11def..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]; @@ -33,43 +16,27 @@ string Robber::turn(){ cerr << "Discarding: " << street->first << " since car is needed" << endl; continue; } - double goodness = 10; + double goodness = 0; Intersection& conInter = _intersections[street->first]; - list closestFootCop = shortestPath(street->first, cop_foot, FindPlayer(_players, cop_foot, 5)); - list closestCarCop = shortestPath(street->first, cop_car, FindPlayer(_players, cop_car, 4)); + 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; - if (closestFootCop.size() < closestCarCop.size() && closestFootCop.size() > 0) - closestCop = closestFootCop.size(); - else { + if (closestCarCop.size() < closestFootCop.size() && closestCarCop.size() > 0){ closestCop = closestCarCop.size(); copInCar = true; - } + }else + closestCop = closestFootCop.size(); - if (closestCop > 0){ + if (closestCop > 0 && closestCop < 3){ cerr << "Cop " << closestCop << " intersections away." << endl; - if (closestCop < 3) - continue; - if (!copInCar) - --closestCop; - goodness *= 1 - 1/closestCop; + continue; } - if (conInter.type == bank){ - cerr << "FOUND A BANK" << endl; - if (closestCop > 0 && closestCop < 4) - continue; - else if (_banks[street->first] > 0){ - cerr << "No cop close to bank" << endl; - return street->first; - } - } - if (goodness == 0) - 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; @@ -77,14 +44,35 @@ string Robber::turn(){ list l = shortestPath(street->first, _type, SimpleSPGoal(bank->first)); if (l.size() < 1) continue; - list::iterator i = l.begin(); + //list::iterator i = l.begin(); //++i; - banks.push_back(bank->second/(pow(l.size(),2.0))); + banks.push(bank->second/(pow(l.size(),4.0))); } } - sort(banks.begin(),banks.end()); - for (unsigned int i = 0; i < 2 && i < banks.size();++i) - goodness += banks[i]; + //sort(banks.begin(),banks.end(),greater()); + + 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){ + cerr << "Cop " << closestCop << " intersections away." << endl; + goodness *= 1 - 1/(copInCar ? closestCop : closestCop - 1); + } + cerr << "Goodness after cop: " << goodness << endl; + + if (conInter.type == bank){ + cerr << "FOUND A BANK" << endl; + if (closestCop > 0 && closestCop < 4) + continue; + else if (_banks[street->first] > 0){ + cerr << "No cop close to bank" << endl; + return street->first; + } + } + cerr << "Street: " << street->first << " goodness: " << goodness << endl; streets[street->first] = goodness; } @@ -97,7 +85,7 @@ string Robber::turn(){ cerr << endl; */ - string destination; + string destination = _location; double goodness = 0; for (hash_map::const_iterator dest = streets.begin(); dest != streets.end(); ++dest){