X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=copsrc%2Fcop.cpp;h=fd40792bfc10151d5416a7360d33beb2a131a3a4;hb=a76a0b3a94ab89c98135829d163a5fd303398f98;hp=f5a7f3f3e23f369c2291be78ee3042ea85a2678f;hpb=e80a1fceda25988c576631be47a9b122126d8f53;p=icfp05.git diff --git a/copsrc/cop.cpp b/copsrc/cop.cpp index f5a7f3f..fd40792 100644 --- a/copsrc/cop.cpp +++ b/copsrc/cop.cpp @@ -1,15 +1,19 @@ #include "cop.h" #include +#include #include +#include #include using namespace std; using namespace __gnu_cxx; string Cop::turn(){ + //cerr << "New turn" << endl; string input; sendInformation(); + //cerr << "Getting information " << endl; getInformation(); sendPlan(); @@ -17,35 +21,285 @@ string Cop::turn(){ vote(); - //Ignore vote getline(cin,input); + if (input != "nowinner:"){ + string winner = value(input); + if (winner != _name) + ++_winningPlans[winner]; + } return _location; } +void Cop::preGamePreparations(){ + //cerr << "Preparing.." << endl; + _copTargets[_name].first = _robberLocation; + _copTargets[_name].second = cop_foot; + + priority_queue > banks; + //cerr << "Number of banks: " << endl; + for(hash_map::const_iterator bank = _banks.begin(); + bank != _banks.end(); ++bank){ + //cerr << "Finding bank: " << bank->first << endl; + list bankRoute = shortestPath(_robberLocation, robber, SimpleSPGoal(bank->first)); + //cerr << "Pushing bank" << endl; + banks.push(pair(-bankRoute.size(), bank->first)); + } + //cerr << "Done finding banks.." << endl; + priority_queue > banks2; + for (int i = 0; i < 4 && banks.size() > 0;++i){ + const pair& bank = banks.top(); + //cerr << "Going to bank: " << bank.second << ", distance" << -bank.first << endl; + list bankRouteFoot = shortestPath(_copHq, cop_foot, SimpleSPGoal(bank.second)); + list bankRouteCar = shortestPath(_copHq, cop_car, SimpleSPGoal(bank.second)); + banks2.push(pair(bankRouteCar.size() - bankRouteFoot.size(), bank.second)); + banks.pop(); + } + for (hash_map::const_iterator player = _players.begin(); + player != _players.end(); ++player){ + cerr << "Inital plan for player: " << player->first << endl; + if (player->second.type == robber){ + _robber = player->first; + continue; + }else if (banks2.size() <= 0 || player->first == _name) + continue; + + const pair& bank = banks2.top(); + _copTargets[player->first].first = bank.second; + //cerr << "Sending: " << player->first << " to: " << bank.second; + if (banks2.size() <= 2) + _copTargets[player->first].second = cop_car; + else + _copTargets[player->first].second = cop_foot; + //cerr << " on: " << _copTargets[player->first].second << endl; + _winningPlans[player->first] = 0; + banks2.pop(); + } + _maybeRobber.push_back(hash_map()); +} + void Cop::sendInformation(){ + _maybeRobber.push_back(hash_map()); + hash_map& maybeRobber = _maybeRobber.back(); + int possibilities = 0; + if (_robberLocation.empty()){ + + hash_map::const_iterator intersection = _intersections.find(_location); + + for (hash_map::const_iterator adj = intersection->second.connections.begin(); + adj != intersection->second.connections.end(); ++adj){ + + if (_smell == 1){ + hash_map::iterator location = maybeRobber.find(adj->first); + if (location == maybeRobber.end()){ + hash_map::const_iterator intersection = _intersections.find(adj->first); + int neigh = maybeAtNeighbor(intersection->second); + if (neigh > -1){ + maybeRobber[adj->first] = 100 + neigh; + ++possibilities; + }else + maybeRobber[adj->first] = -100; + } + }else{ + if (_smell == 0) + maybeRobber[adj->first] = -100; + hash_map::const_iterator intersection = _intersections.find(adj->first); + for (hash_map::const_iterator adj = intersection->second.connections.begin(); + adj != intersection->second.connections.end(); ++adj){ + hash_map::iterator location = maybeRobber.find(adj->first); + if (location == maybeRobber.end()){ + if (_smell == 0) + maybeRobber[adj->first] = -100; + else { + hash_map::const_iterator intersection = _intersections.find(adj->first); + int neigh = maybeAtNeighbor(intersection->second); + if (neigh > -1){ + maybeRobber[adj->first] = 100 + neigh; + ++possibilities; + } + else + maybeRobber[adj->first] = -100; + } + } + } + } + } + } else { + maybeRobber[_robberLocation] = 100; + possibilities = 1; + hash_map::const_iterator intersection = _intersections.find(_location); + + for (hash_map::const_iterator adj = intersection->second.connections.begin(); + adj != intersection->second.connections.end(); ++adj){ + maybeRobber[adj->first] = -100; + for (hash_map::const_iterator adj = intersection->second.connections.begin(); + adj != intersection->second.connections.end(); ++adj){ + hash_map::iterator location = maybeRobber.find(adj->first); + if (location != maybeRobber.end()) + maybeRobber[adj->first] = -100; + } + + } + + + } cout << "inf\\" << endl; + for (hash_map::iterator location = maybeRobber.begin(); + location != maybeRobber.end(); ++location){ + if (location->second > 0) + location->second /= possibilities; + cout << "inf: " << _robber << " " << location->first << " " << _playerTypeNames[robber] << " " + << _world << " " << location->second << endl; + } cout << "inf/" << endl; } void Cop::getInformation(){ string input; + if (_robberLocation.empty()){ + hash_map& maybeRobber = _maybeRobber.back(); + while (true){ + getline(cin, input); + if (input == "from/") + break; - //ignore From-inform - do{ - getline(cin,input); - }while(input != "from/"); + getline(cin, input); + getline(cin, input); + + while (true){ + getline(cin, input); + if (input == "inf/") + break; + istringstream inf(input); + inf >> input; + string bot; + inf >> bot; + string loc; + inf >> loc; + string type; + inf >> type; + if (type != _playerTypeNames[robber]) + continue; + int world; + inf >> world; + if (world != _world) + continue; + int certainty; + inf >> certainty; + + hash_map::iterator location = maybeRobber.find(loc); + if (location == maybeRobber.end()){ + hash_map::const_iterator intersection = _intersections.find(loc); + if (intersection != _intersections.end()) + continue; //The intersection doesn't exist, so ignore it. + int neigh = maybeAtNeighbor(intersection->second); + if (neigh >= 0) + maybeRobber[loc] = certainty + neigh; + else + maybeRobber[loc] = -200; + }else if (location->second > 0) + location->second += certainty; + } + } + }else{ + do{ + getline(cin,input); + }while(input != "from/"); + } + _maybeRobber.pop_front(); + +} + +int Cop::maybeAtNeighbor(const Intersection& intersection){ + int possibility = -1; + for (hash_map::const_iterator adj = intersection.connections.begin(); + adj != intersection.connections.end(); ++adj){ + hash_map::iterator oldLoc = _maybeRobber.front().find(adj->first); + if (oldLoc == _maybeRobber.front().end() || oldLoc->second > 0){ + if (possibility < 0){ + possibility = 0; + } + if (oldLoc != _maybeRobber.front().end()) + possibility += oldLoc->second; + } + } + return possibility; } void Cop::sendPlan(){ + //cerr << "Planning" << endl; + string secondLocation = _robberLocation; + if (_robberLocation.empty()){ + priority_queue > positions; + for (hash_map::iterator location = _maybeRobber.front().begin(); + location != _maybeRobber.front().end(); ++location){ + if (location->second > 0) + positions.push(pair(location->second,location->first)); + + } + if (positions.size() > 0){ + _robberLocation = positions.top().second; + cerr << "Sending myself to: " << _robberLocation << ", probability of robber: " << positions.top().first << endl; + } + if (positions.size() > 1){ + positions.pop(); + secondLocation = positions.top().second; + cerr << "Sending another cop to: " << secondLocation << ", probability of robber: " << positions.top().first << endl; + } + } + if (!_robberLocation.empty()){ + //cerr << "Robber found at " << _robberLocation << endl; + _copTargets[_name].first = _robberLocation; + + if (!secondLocation.empty()){ + list closestFootCop = shortestPath(_robberLocation, cop_foot, FindPlayer(_players, cop_foot), true); + list closestCarCop = shortestPath(_robberLocation, cop_car, FindPlayer(_players, cop_car, closestFootCop.size() - 1), true); + PlayerType copType = cop_foot; + string copLocation; + if (closestCarCop.size() > 0){ + copType = cop_car; + copLocation = closestCarCop.back(); + }else + copLocation = closestFootCop.back(); + + + for (hash_map::const_iterator player = _players.begin(); + player != _players.end(); ++player){ + if (player->first == _name || player->second.type == robber) + continue; + if (player->second.type == copType && player->second.location == copLocation) + _copTargets[player->first].first = _robberLocation; + } + } + } + //cerr << "Sending plan." << endl; cout << "plan\\" << endl; - //cout << "plan: " << _name << endl; + for(hash_map >::iterator player = _copTargets.begin(); + player != _copTargets.end(); ++player){ + Player& pl = _players[player->first]; + if (pl.type != player->second.second + && pl.location != _copHq) + player->second.second = pl.type; + list playerRoute = shortestPath(pl.location, player->second.second, SimpleSPGoal(player->second.first)); + if (playerRoute.size() > 1){ + list::iterator i = playerRoute.begin(); + ++i; + if (*i == _robberLocation || !(playerRoute.size() == 2 && _intersections[*i].type == bank)){ + if (player->first == _name) + _location = *i; + //cerr << "Sending " << player->first << " to " << *i << " by " << player->second.second << endl; + cout << "plan: " << player->first << " " << *i << " " << _playerTypeNames[player->second.second] << " " << _world+1 << endl; + } + } + } + cout << "plan/" << endl; } void Cop::getPlans(){ string input; + //ignore From-plan do{ getline(cin,input); @@ -57,18 +311,22 @@ void Cop::getPlans(){ void Cop::vote(){ cout << "vote\\" << endl; cout << "vote: " << _name << endl; - for (hash_map::const_iterator player = _players.begin(); - player != _players.end(); ++player){ - if (player->second.type != robber && player->first != _name){ - cout << "vote: " << player->first << endl; - cerr << "voted for " << player->first << " of type: " << player->second.type << endl; - } + priority_queue > players; + for (hash_map::const_iterator player = _winningPlans.begin(); + player != _winningPlans.end(); ++player){ + players.push(pair(-player->second, player->first)); + } + while (players.size() > 0){ + const pair& player = players.top(); + cout << "vote: " << player.second << endl; + //cerr << "voted for " << player.second << " with " << player.first << " previously won plans" << endl; + players.pop(); } cout << "vote/" << endl; } int main(){ - Cop cop("cop"); + Cop cop("harvCop"); cop.play(); return 0;