X-Git-Url: https://ruin.nu/git/?p=icfp05.git;a=blobdiff_plain;f=copsrc%2Fcop.cpp;h=2a8002293094ddca3436f249487d2c9c25a9ac68;hp=dd0b1d1a38fee9866b331f2585914d362d505f3f;hb=7ea4f9f073009ba9a6bbf2fec398b0742f798658;hpb=d9ea67edb4cdaab1f5f7810de640f8fb722a15d1 diff --git a/copsrc/cop.cpp b/copsrc/cop.cpp index dd0b1d1..2a80022 100644 --- a/copsrc/cop.cpp +++ b/copsrc/cop.cpp @@ -205,7 +205,7 @@ int Cop::maybeAtNeighbor(const Intersection& intersection){ void Cop::sendPlan(){ //cerr << "Planning" << endl; - string secondLocation = _robberLocation; + list locations; if (_robberLocation.empty()){ priority_queue > positions; for (hash_map::iterator location = _maybeRobber.front().begin(); @@ -218,35 +218,41 @@ void Cop::sendPlan(){ _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); } if (!_robberLocation.empty()){ //cerr << "Robber found at " << _robberLocation << endl; _copTargets[_name].first = _robberLocation; - - if (!secondLocation.empty()){ - 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(); - - + + vector busyCops; + busyCops.push_back(_name); + while (locations.size() > 0){ + string cop; + int dist = 1000000; for (hash_map::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 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;