From: Michael Andreen Date: Mon, 27 Jun 2005 13:29:33 +0000 (+0000) Subject: done, for now X-Git-Url: https://ruin.nu/git/?p=icfp05.git;a=commitdiff_plain;h=6b0d8904651d810411bef9b8ad213125fa437bd0 done, for now --- diff --git a/botsrc/bot.cpp b/botsrc/bot.cpp index 203c969..7635f13 100644 --- a/botsrc/bot.cpp +++ b/botsrc/bot.cpp @@ -41,6 +41,8 @@ void Bot::play(){ getline(cin, input); buildGraph(); + preGamePreparations(); + while (true){ getline(cin, input); if (input == "game-over") @@ -90,15 +92,22 @@ void Bot::buildGraph(){ break; istringstream node(input); node >> input; + string name; + node >> name; + Intersection& inter = _intersections[name]; node >> input; - Intersection& inter = _intersections[input]; - node >> input; - if (input == "bank") + if (input == "bank"){ inter.type = bank; - else if (input == "hq") + _banks[name] = 0; + } + else if (input == "hq"){ inter.type = hq; - else if (input == "robber-start") + _copHq = name; + } + else if (input == "robber-start"){ inter.type = robber_start; + _robberLocation = name; + } else inter.type = ordinary; node >> inter.x; @@ -177,6 +186,7 @@ void Bot::updateWorld(){ getline(cin,input); _smell = value(input); + _robberLocation = ""; getline(cin,input); while (true){ getline(cin, input); @@ -190,6 +200,8 @@ void Bot::updateWorld(){ player >> pl.location; player >> input; pl.type = _playerTypes[input]; + if (pl.type == robber) + _robberLocation = pl.location; } //cerr << "Number of players: " << _players.size() << endl; getline(cin, input); diff --git a/botsrc/bot.h b/botsrc/bot.h index 2645ac0..306ec7e 100644 --- a/botsrc/bot.h +++ b/botsrc/bot.h @@ -99,6 +99,8 @@ class Bot { int _world; int _robbed; int _smell; + std::string _robberLocation; + std::string _copHq; }; class SimpleSPGoal : public SPGoal{ diff --git a/copsrc/cop.cpp b/copsrc/cop.cpp index f5a7f3f..8874574 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,12 +21,57 @@ 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() && banks2.size() > 0; ++player){ + if (player->first == _name || player->second.type == robber) + 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(); + } +} + void Cop::sendInformation(){ cout << "inf\\" << endl; cout << "inf/" << endl; @@ -31,21 +80,101 @@ void Cop::sendInformation(){ void Cop::getInformation(){ string input; - //ignore From-inform - do{ - getline(cin,input); - }while(input != "from/"); + if (false && _robberLocation.empty()){ //Disable for now, since it takes to long time, and does nothing + if (_smell > 0){ + //TODO: Calculate smell + } + while (true){ + getline(cin, input); + if (input == "from/") + break; + + 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; + int world; + inf >> world; + if (world != _world) + continue; + int certainty; + inf >> certainty; + + //TODO: Calculate possibilties + } + } + }else{ + do{ + getline(cin,input); + }while(input != "from/"); + } + } void Cop::sendPlan(){ + //cerr << "Planning" << endl; + if (_robberLocation.empty()){ + //Use information for plan. + } + else{ + //cerr << "Robber found at " << _robberLocation << endl; + _copTargets[_name].first = _robberLocation; + 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 +186,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; diff --git a/copsrc/cop.h b/copsrc/cop.h index 42cb778..0cc2a64 100644 --- a/copsrc/cop.h +++ b/copsrc/cop.h @@ -2,6 +2,7 @@ #define __COP_H__ #include +#include class Cop : public Bot { public: @@ -9,10 +10,16 @@ class Cop : public Bot { std::string turn(); protected: + virtual void preGamePreparations(); void sendInformation(); void getInformation(); void sendPlan(); void getPlans(); void vote(); + + __gnu_cxx::hash_map > _copTargets; + std::vector _noRobber; + __gnu_cxx::hash_map _maybeRobber; + __gnu_cxx::hash_map _winningPlans; }; #endif diff --git a/robbersrc/robber.cpp b/robbersrc/robber.cpp index a9ab618..50db510 100644 --- a/robbersrc/robber.cpp +++ b/robbersrc/robber.cpp @@ -20,12 +20,12 @@ string Robber::turn(){ Intersection& conInter = _intersections[street->first]; 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); + list closestCarCop = shortestPath(street->first, cop_car, FindPlayer(_players, cop_car, closestFootCop.size() - 1), true); unsigned int closestCop = 0; bool copInCar = false; - if (closestCarCop.size() < closestFootCop.size() && closestCarCop.size() > 0){ + if (closestCarCop.size() > 0){ closestCop = closestCarCop.size(); copInCar = true; }else @@ -112,7 +112,7 @@ string Robber::turn(){ } int main(){ - Robber robber("robber"); + Robber robber("harv-robber"); robber.play(); return 0;