#include "cop.h"
#include <iostream>
+#include <sstream>
#include <iterator>
+#include <queue>
#include <cmath>
using namespace std;
using namespace __gnu_cxx;
-string Cop::turn(){
- string input;
+void Cop::preGamePreparations(){
+ //cerr << "Preparing.." << endl;
+ _copTargets[_name].first = _robberLocation;
+ _copTargets[_name].second = cop_foot;
- sendInformation();
- getInformation();
+ priority_queue<pair<int,string> > banks;
+ //cerr << "Number of banks: " << endl;
+ for(hash_map<string,int>::const_iterator bank = _banks.begin();
+ bank != _banks.end(); ++bank){
+ //cerr << "Finding bank: " << bank->first << endl;
+ list<string> bankRoute = shortestPath(_robberLocation, robber, SimpleSPGoal(bank->first));
+ //cerr << "Pushing bank" << endl;
+ banks.push(pair<int,string>(-bankRoute.size(), bank->first));
+ }
+ //cerr << "Done finding banks.." << endl;
+ priority_queue<pair<int,string> > banks2;
+ for (int i = 0; i < 4 && banks.size() > 0;++i){
+ const pair<int,string>& bank = banks.top();
+ //cerr << "Going to bank: " << bank.second << ", distance" << -bank.first << endl;
+ list<string> bankRouteFoot = shortestPath(_copHq, cop_foot, SimpleSPGoal(bank.second));
+ list<string> bankRouteCar = shortestPath(_copHq, cop_car, SimpleSPGoal(bank.second));
+ banks2.push(pair<int,string>(bankRouteCar.size() - bankRouteFoot.size(), bank.second));
+ banks.pop();
+ }
+ for (hash_map<string,Player>::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;
- sendPlan();
- getPlans();
+ const pair<int,string>& 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<string,int>());
+}
- vote();
+void Cop::sendInformation(){
+ _maybeRobber.push_back(hash_map<string,int>());
+ hash_map<string,int>& maybeRobber = _maybeRobber.back();
+ int possibilities = 0;
+ if (_robberLocation.empty()){
- //Ignore vote
- getline(cin,input);
+ hash_map<string, Intersection>::const_iterator intersection = _intersections.find(_location);
- return _location;
-}
+ for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
+ adj != intersection->second.connections.end(); ++adj){
-void Cop::sendInformation(){
+ if (_smell == 1){
+ hash_map<string,int>::iterator location = maybeRobber.find(adj->first);
+ if (location == maybeRobber.end()){
+ hash_map<string, Intersection>::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<string, Intersection>::const_iterator intersection = _intersections.find(adj->first);
+ for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
+ adj != intersection->second.connections.end(); ++adj){
+ hash_map<string,int>::iterator location = maybeRobber.find(adj->first);
+ if (location == maybeRobber.end()){
+ if (_smell == 0)
+ maybeRobber[adj->first] = -100;
+ else {
+ hash_map<string, Intersection>::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<string, Intersection>::const_iterator intersection = _intersections.find(_location);
+
+ for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
+ adj != intersection->second.connections.end(); ++adj){
+ maybeRobber[adj->first] = -100;
+ for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
+ adj != intersection->second.connections.end(); ++adj){
+ hash_map<string,int>::iterator location = maybeRobber.find(adj->first);
+ if (location != maybeRobber.end())
+ maybeRobber[adj->first] = -100;
+ }
+
+ }
+
+
+ }
cout << "inf\\" << endl;
+ for (hash_map<string,int>::iterator location = maybeRobber.begin();
+ location != maybeRobber.end(); ++location){
+ if (location->second > 0)
+ location->second /= possibilities;
+ cerr << "World: " << _world << endl;;
+ cout << "inf: " << _robber << " " << location->first << " " << _playerTypeNames[robber] << " "
+ << _world << " " << location->second << endl;
+ }
cout << "inf/" << endl;
}
void Cop::getInformation(){
string input;
+ if (_robberLocation.empty()){
+ hash_map<string,int>& maybeRobber = _maybeRobber.back();
+ 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;
+ string type;
+ inf >> type;
+ if (type != _playerTypeNames[robber])
+ continue;
+ int world;
+ inf >> world;
+ if (world != _world)
+ continue;
+ int certainty;
+ inf >> certainty;
- //ignore From-inform
- do{
- getline(cin,input);
- }while(input != "from/");
+ hash_map<string,int>::iterator location = maybeRobber.find(loc);
+ if (location == maybeRobber.end()){
+ hash_map<string, Intersection>::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();
+
}
-void Cop::sendPlan(){
- cout << "plan\\" << endl;
- //cout << "plan: " << _name << endl;
- cout << "plan/" << endl;
+int Cop::maybeAtNeighbor(const Intersection& intersection){
+ int possibility = -1;
+ for (hash_map<string,StreetType>::const_iterator adj = intersection.connections.begin();
+ adj != intersection.connections.end(); ++adj){
+ hash_map<string,int>::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::getPlans(){
- string input;
+void Cop::sendPlan(){
+ //cerr << "Planning" << endl;
+ string secondLocation = _robberLocation;
+ if (_robberLocation.empty()){
+ priority_queue<pair<int,string> > positions;
+ for (hash_map<string,int>::iterator location = _maybeRobber.front().begin();
+ location != _maybeRobber.front().end(); ++location){
+ if (location->second > 0)
+ positions.push(pair<int,string>(location->second,location->first));
- //ignore From-plan
- do{
- getline(cin,input);
- }while(input != "from/");
+ }
+ 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<string> closestFootCop = shortestPath(_robberLocation, cop_foot, FindPlayer(_players, cop_foot), true);
+ list<string> 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();
-}
-void Cop::vote(){
- cout << "vote\\" << endl;
- cout << "vote: " << _name << endl;
- for (hash_map<string,Player>::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;
+ for (hash_map<string,Player>::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;
+ for(hash_map<string, pair<string, PlayerType> >::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<string> playerRoute = shortestPath(pl.location, player->second.second, SimpleSPGoal(player->second.first));
+ if (playerRoute.size() > 1){
+ list<string>::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 << "vote/" << endl;
+
+ cout << "plan/" << endl;
+}
+
+void Cop::move(std::string location){
+ cout << "cmov\\" << endl;
+ cout << "straight-arrow:" << endl;
+ cout << "mov\\" << endl;
+ Bot::move(location);
+ cout << "mov/" << endl;
+ cout << "acc\\" << endl;
+ cout << "acc/" << endl;
+ cout << "cmov/" << endl;
}
int main(){
- Cop cop("cop");
+ Cop cop("harvCop");
cop.play();
return 0;