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();
_robberLocation = positions.top().second;
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;