]> ruin.nu Git - icfp05.git/blobdiff - copsrc/cop.cpp
added license
[icfp05.git] / copsrc / cop.cpp
index aed3aeb2b963d9aa6120370dcaa7ee84f56ed34e..411c11122365b89e0d16a5c3fa01fcd9b765357d 100644 (file)
@@ -34,7 +34,7 @@ void Cop::preGamePreparations(){
        }
        for (hash_map<string,Player>::const_iterator player = _players.begin();
                        player != _players.end(); ++player){
-               cerr << "Inital plan for player: " << player->first << endl;
+               //cerr << "Inital plan for player: " << player->first << endl;
                if (player->second.type == robber){
                        _robber = player->first;
                        continue;
@@ -125,7 +125,6 @@ void Cop::sendInformation(){
                        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;
        }
@@ -206,7 +205,7 @@ int Cop::maybeAtNeighbor(const Intersection& intersection){
 
 void Cop::sendPlan(){
        //cerr << "Planning" << endl;
-       string secondLocation = _robberLocation;
+       list<string> locations;
        if (_robberLocation.empty()){
                priority_queue<pair<int,string> > positions;
                for (hash_map<string,int>::iterator location = _maybeRobber.front().begin();
@@ -217,37 +216,44 @@ void Cop::sendPlan(){
                }
                if (positions.size() > 0){
                        _robberLocation = positions.top().second;
-                       cerr << "Sending myself to: " << _robberLocation << ", probability of robber: " << positions.top().first << endl;
+                       //cerr << "Sending myself to: " << _robberLocation << ", probability of robber: " << positions.top().first << endl;
                }
-               if (positions.size() > 1){
+               for (int i = 0; i < 2 && positions.size() > 1; ++i ){
                        positions.pop();
-                       secondLocation = positions.top().second;
-                       cerr << "Sending another cop to: " << secondLocation << ", probability of robber: " << positions.top().first << endl;
+                       locations.push_back(positions.top().second);
+                       //cerr << "Sending another cop to: " << locations.back() << ", probability of robber: " << positions.top().first << endl;
                }
+       }else{
+               locations.push_back(_robberLocation);
+               locations.push_back(_robberLocation);
        }
        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();
-
-
+               
+               vector<string> busyCops;
+               busyCops.push_back(_name);
+               while (locations.size() > 0){
+                       string cop;
+                       int dist = 1000000;
                        for (hash_map<string,Player>::const_iterator player = _players.begin();
-                                       player != _players.end(); ++player){
-                               if (player->first == _name || player->second.type == robber)
+                                       player != _players.end();++player){
+                               if (player->second.type == robber || find(busyCops.begin(), busyCops.end(), player->first) != busyCops.end())
                                        continue;
-                               if (player->second.type == copType && player->second.location == copLocation)
-                                       _copTargets[player->first].first = _robberLocation;
+                               list<string> l = shortestPath(player->second.location, player->second.type,SimpleSPGoal(locations.front(), dist-1));
+                               if (l.size() > 0 && l.size() < dist){
+                                       dist = l.size();
+                                       cop = player->first;
+                                       if (dist == 1)
+                                               break;
+                               }
+                       }
+                       if (!cop.empty()){
+                               //cerr << "Sending " << cop << " to " << locations.front() << endl;
+                               _copTargets[cop].first = locations.front();
+                               busyCops.push_back(cop);
                        }
+                       locations.pop_front();
                }
        }
        //cerr << "Sending plan." << endl;
@@ -291,3 +297,5 @@ int main(){
 
        return 0;
 }
+
+#include "../botsrc/shortestPath.cpp"