X-Git-Url: https://ruin.nu/git/?p=icfp05.git;a=blobdiff_plain;f=robber%2Frobber.cpp;h=dbb287a4d760b5bb2dd231497778866318fb24a4;hp=52e00de1fc50775d37093db9373e234976a66c3f;hb=d7d9942fc9d1066670e166182e36791dfbf035d7;hpb=33d49b42ba7bb8e9d043d0f33489cffaad303d43 diff --git a/robber/robber.cpp b/robber/robber.cpp index 52e00de..dbb287a 100644 --- a/robber/robber.cpp +++ b/robber/robber.cpp @@ -1,28 +1,12 @@ #include "robber.h" #include #include +#include #include using namespace std; using namespace __gnu_cxx; -struct FindCop : SPGoal{ - int _limit; - const hash_map& _players; - FindCop(const hash_map& players, int limit = 0) : _players(players), _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 != robber && player->second.location == node->name){ - return 1; - } - } - return 0; - } -}; - string Robber::turn(){ hash_map streets; Intersection& inter = _intersections[_location]; @@ -32,29 +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 l = shortestPath(street->first, _type, FindCop(_players, 5)); - if (l.size() > 0){ - cerr << "Cop " << l.size() << " intersections away." << endl; - if (l.size() < 3) - continue; - goodness *= 1 - 1/l.size(); - } + 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); - if (conInter.type == bank){ - cerr << "FOUND A BANK" << endl; - if (l.size() > 0 && l.size() < 4) - continue; - else if (_banks[street->first] > 0){ - cerr << "No cop close to bank" << endl; - return street->first; - } - } - if (goodness == 0) + unsigned int closestCop = 0; + bool copInCar = false; + + if (closestCarCop.size() < closestFootCop.size() && closestCarCop.size() > 0){ + closestCop = closestCarCop.size(); + copInCar = true; + }else + closestCop = closestFootCop.size(); + + if (closestCop > 0 && closestCop < 3){ + cerr << "Cop " << closestCop << " intersections away." << endl; 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; @@ -62,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(),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; } } - sort(banks.begin(),banks.end()); - for (unsigned int i = 0; i < 2 && i < banks.size();++i) - goodness += banks[i]; + cerr << "Street: " << street->first << " goodness: " << goodness << endl; streets[street->first] = goodness; } @@ -82,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){