#include "cop.h"
#include <iostream>
+#include <sstream>
#include <iterator>
+#include <queue>
#include <cmath>
using namespace std;
using namespace __gnu_cxx;
string Cop::turn(){
+ //cerr << "New turn" << endl;
string input;
sendInformation();
+ //cerr << "Getting information " << endl;
getInformation();
sendPlan();
vote();
- //Ignore vote
getline(cin,input);
+ if (input != "nowinner:"){
+ string winner = value<string>(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<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() && banks2.size() > 0; ++player){
+ if (player->first == _name || player->second.type == robber)
+ continue;
+ 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();
+ }
+}
+
void Cop::sendInformation(){
cout << "inf\\" << endl;
cout << "inf/" << endl;
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<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();
+
+
+ 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;
- //cout << "plan: " << _name << 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 << "plan/" << endl;
}
void Cop::getPlans(){
string input;
+
//ignore From-plan
do{
getline(cin,input);
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;
- }
+ priority_queue<pair<int,string> > players;
+ for (hash_map<string,int>::const_iterator player = _winningPlans.begin();
+ player != _winningPlans.end(); ++player){
+ players.push(pair<int,string>(-player->second, player->first));
+ }
+ while (players.size() > 0){
+ const pair<int,string>& 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;