]> ruin.nu Git - icfp05.git/blob - copsrc/cop.cpp
added license
[icfp05.git] / copsrc / cop.cpp
1 #include "cop.h"
2 #include <iostream>
3 #include <sstream>
4 #include <iterator>
5 #include <queue>
6 #include <cmath>
7
8 using namespace std;
9 using namespace __gnu_cxx;
10
11 void Cop::preGamePreparations(){
12         //cerr << "Preparing.." << endl;
13         _copTargets[_name].first = _robberLocation;
14         _copTargets[_name].second = cop_foot;
15
16         priority_queue<pair<int,string> > banks;
17         //cerr << "Number of banks: " << endl;
18         for(hash_map<string,int>::const_iterator bank = _banks.begin();
19                                 bank != _banks.end(); ++bank){
20                 //cerr << "Finding bank: " << bank->first << endl;
21                 list<string> bankRoute  = shortestPath(_robberLocation, robber, SimpleSPGoal(bank->first));
22                 //cerr << "Pushing bank" << endl;
23                 banks.push(pair<int,string>(-bankRoute.size(), bank->first));
24         }
25         //cerr << "Done finding banks.." << endl;
26         priority_queue<pair<int,string> > banks2;
27         for (int i = 0; i < 4 && banks.size() > 0;++i){
28                 const pair<int,string>& bank = banks.top();
29                 //cerr << "Going to bank: " << bank.second << ", distance" << -bank.first << endl;
30                 list<string> bankRouteFoot = shortestPath(_copHq, cop_foot, SimpleSPGoal(bank.second));
31                 list<string> bankRouteCar = shortestPath(_copHq, cop_car, SimpleSPGoal(bank.second));
32                 banks2.push(pair<int,string>(bankRouteCar.size() - bankRouteFoot.size(), bank.second));
33                 banks.pop();
34         }
35         for (hash_map<string,Player>::const_iterator player = _players.begin();
36                         player != _players.end(); ++player){
37                 //cerr << "Inital plan for player: " << player->first << endl;
38                 if (player->second.type == robber){
39                         _robber = player->first;
40                         continue;
41                 }else if (banks2.size() <= 0 || player->first == _name)
42                         continue;
43
44                 const pair<int,string>& bank = banks2.top();
45                 _copTargets[player->first].first = bank.second;
46                 //cerr << "Sending: " << player->first << " to: " << bank.second;
47                 if (banks2.size() <= 2)
48                         _copTargets[player->first].second = cop_car;
49                 else
50                         _copTargets[player->first].second = cop_foot;
51                 //cerr << " on: " << _copTargets[player->first].second << endl;
52                 _winningPlans[player->first] = 0;
53                 banks2.pop();
54         }
55         _maybeRobber.push_back(hash_map<string,int>());
56 }
57
58 void Cop::sendInformation(){
59         _maybeRobber.push_back(hash_map<string,int>());
60         hash_map<string,int>& maybeRobber = _maybeRobber.back();
61         int possibilities = 0;
62         if (_robberLocation.empty()){
63
64                 hash_map<string, Intersection>::const_iterator intersection = _intersections.find(_location);
65
66                 for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
67                                 adj != intersection->second.connections.end(); ++adj){
68
69                         if (_smell == 1){
70                                 hash_map<string,int>::iterator location = maybeRobber.find(adj->first);
71                                 if (location == maybeRobber.end()){
72                                         hash_map<string, Intersection>::const_iterator intersection = _intersections.find(adj->first);
73                                         int neigh = maybeAtNeighbor(intersection->second);
74                                         if (neigh > -1){
75                                                 maybeRobber[adj->first] = 100 + neigh;
76                                                 ++possibilities;
77                                         }else
78                                                 maybeRobber[adj->first] = -100;
79                                 }
80                         }else{
81                                 if (_smell == 0)
82                                         maybeRobber[adj->first] = -100;
83                                 hash_map<string, Intersection>::const_iterator intersection = _intersections.find(adj->first);
84                                 for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
85                                                 adj != intersection->second.connections.end(); ++adj){
86                                         hash_map<string,int>::iterator location = maybeRobber.find(adj->first);
87                                         if (location == maybeRobber.end()){
88                                                 if (_smell == 0)
89                                                         maybeRobber[adj->first] = -100;
90                                                 else {
91                                                         hash_map<string, Intersection>::const_iterator intersection = _intersections.find(adj->first);
92                                                         int neigh = maybeAtNeighbor(intersection->second);
93                                                         if (neigh > -1){
94                                                                 maybeRobber[adj->first] = 100 + neigh;
95                                                                 ++possibilities;
96                                                         }
97                                                         else
98                                                                 maybeRobber[adj->first] = -100;
99                                                 }
100                                         }
101                                 }
102                         }
103                 }
104         } else {
105                 maybeRobber[_robberLocation] = 100;
106                 possibilities = 1;
107                 hash_map<string, Intersection>::const_iterator intersection = _intersections.find(_location);
108
109                 for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
110                                 adj != intersection->second.connections.end(); ++adj){
111                         maybeRobber[adj->first] = -100;
112                         for (hash_map<string,StreetType>::const_iterator adj = intersection->second.connections.begin();
113                                         adj != intersection->second.connections.end(); ++adj){
114                                 hash_map<string,int>::iterator location = maybeRobber.find(adj->first);
115                                 if (location != maybeRobber.end())
116                                         maybeRobber[adj->first] = -100;
117                         }
118
119                 }
120
121
122         }
123         cout << "inf\\" << endl;
124         for (hash_map<string,int>::iterator location = maybeRobber.begin();
125                         location != maybeRobber.end(); ++location){
126                 if (location->second > 0)
127                         location->second /= possibilities;
128                 cout << "inf: " << _robber << " " << location->first << " " << _playerTypeNames[robber] << " "
129                         << _world << " " << location->second << endl;
130         }
131         cout << "inf/" << endl;
132 }
133
134 void Cop::getInformation(){
135         string input;
136         if (_robberLocation.empty()){
137                 hash_map<string,int>& maybeRobber = _maybeRobber.back();
138                 while (true){
139                         getline(cin, input);
140                         if (input == "from/")
141                                 break;
142
143                         getline(cin, input);
144                         getline(cin, input);
145
146                         while (true){
147                                 getline(cin, input);
148                                 if (input == "inf/")
149                                         break;
150                                 istringstream inf(input);
151                                 inf >> input;
152                                 string bot;
153                                 inf >> bot;
154                                 string loc;
155                                 inf >> loc;
156                                 string type;
157                                 inf >> type;
158                                 if (type != _playerTypeNames[robber])
159                                         continue;
160                                 int world;
161                                 inf >> world;
162                                 if (world != _world)
163                                         continue;
164                                 int certainty;
165                                 inf >> certainty;
166
167                                 hash_map<string,int>::iterator location = maybeRobber.find(loc);
168                                 if (location == maybeRobber.end()){
169                                         hash_map<string, Intersection>::const_iterator intersection = _intersections.find(loc);
170                                         if (intersection != _intersections.end())
171                                                 continue; //The intersection doesn't exist, so ignore it.
172                                         int neigh = maybeAtNeighbor(intersection->second);
173                                         if (neigh >= 0)
174                                                 maybeRobber[loc] = certainty + neigh;
175                                         else
176                                                 maybeRobber[loc] = -200;
177                                 }else if (location->second > 0)
178                                         location->second += certainty;
179                         }
180                 }
181         }else{
182                 do{
183                         getline(cin,input);
184                 }while(input != "from/");
185         }
186         _maybeRobber.pop_front();
187         
188 }
189
190 int Cop::maybeAtNeighbor(const Intersection& intersection){
191         int possibility = -1;
192         for (hash_map<string,StreetType>::const_iterator adj = intersection.connections.begin();
193                         adj != intersection.connections.end(); ++adj){
194                 hash_map<string,int>::iterator oldLoc = _maybeRobber.front().find(adj->first);
195                 if (oldLoc == _maybeRobber.front().end() || oldLoc->second > 0){
196                         if (possibility < 0){
197                                 possibility = 0;
198                         }
199                         if (oldLoc != _maybeRobber.front().end())
200                                 possibility += oldLoc->second;
201                 }
202         }
203         return possibility;
204 }
205
206 void Cop::sendPlan(){
207         //cerr << "Planning" << endl;
208         list<string> locations;
209         if (_robberLocation.empty()){
210                 priority_queue<pair<int,string> > positions;
211                 for (hash_map<string,int>::iterator location = _maybeRobber.front().begin();
212                                 location != _maybeRobber.front().end(); ++location){
213                         if (location->second > 0)
214                                 positions.push(pair<int,string>(location->second,location->first));
215
216                 }
217                 if (positions.size() > 0){
218                         _robberLocation = positions.top().second;
219                         //cerr << "Sending myself to: " << _robberLocation << ", probability of robber: " << positions.top().first << endl;
220                 }
221                 for (int i = 0; i < 2 && positions.size() > 1; ++i ){
222                         positions.pop();
223                         locations.push_back(positions.top().second);
224                         //cerr << "Sending another cop to: " << locations.back() << ", probability of robber: " << positions.top().first << endl;
225                 }
226         }else{
227                 locations.push_back(_robberLocation);
228                 locations.push_back(_robberLocation);
229         }
230         if (!_robberLocation.empty()){
231                 //cerr << "Robber found at " << _robberLocation << endl;
232                 _copTargets[_name].first = _robberLocation;
233                 
234                 vector<string> busyCops;
235                 busyCops.push_back(_name);
236                 while (locations.size() > 0){
237                         string cop;
238                         int dist = 1000000;
239                         for (hash_map<string,Player>::const_iterator player = _players.begin();
240                                         player != _players.end();++player){
241                                 if (player->second.type == robber || find(busyCops.begin(), busyCops.end(), player->first) != busyCops.end())
242                                         continue;
243                                 list<string> l = shortestPath(player->second.location, player->second.type,SimpleSPGoal(locations.front(), dist-1));
244                                 if (l.size() > 0 && l.size() < dist){
245                                         dist = l.size();
246                                         cop = player->first;
247                                         if (dist == 1)
248                                                 break;
249                                 }
250                         }
251                         if (!cop.empty()){
252                                 //cerr << "Sending " << cop << " to " << locations.front() << endl;
253                                 _copTargets[cop].first = locations.front();
254                                 busyCops.push_back(cop);
255                         }
256                         locations.pop_front();
257                 }
258         }
259         //cerr << "Sending plan." << endl;
260         cout << "plan\\" << endl;
261         for(hash_map<string, pair<string, PlayerType> >::iterator player = _copTargets.begin();
262                         player != _copTargets.end(); ++player){
263                         Player& pl = _players[player->first];
264                 if (pl.type != player->second.second
265                                 && pl.location != _copHq)
266                         player->second.second = pl.type;
267                 list<string> playerRoute = shortestPath(pl.location, player->second.second, SimpleSPGoal(player->second.first));
268                 if (playerRoute.size() > 1){
269                         list<string>::iterator i = playerRoute.begin();
270                         ++i;
271                         if (*i == _robberLocation || !(playerRoute.size() == 2 && _intersections[*i].type == bank)){
272                                 if (player->first == _name)
273                                         _location = *i;
274                                 //cerr << "Sending " << player->first << " to " << *i << " by " << player->second.second << endl;
275                                 cout << "plan: " << player->first << " " << *i << " " << _playerTypeNames[player->second.second] << " " << _world+1 << endl;
276                         }
277                 }
278         }
279
280         cout << "plan/" << endl;
281 }
282
283 void Cop::move(std::string location){
284         cout << "cmov\\" << endl;
285         cout << "straight-arrow:" << endl;
286         cout << "mov\\" << endl;
287         Bot::move(location);
288         cout << "mov/" << endl;
289         cout << "acc\\" << endl;
290         cout << "acc/" << endl;
291         cout << "cmov/" << endl;
292 }
293
294 int main(){
295         Cop cop("harvCop");
296         cop.play();
297
298         return 0;
299 }
300
301 #include "../botsrc/shortestPath.cpp"