From: Michael Andreen Date: Sun, 26 Jun 2005 22:34:21 +0000 (+0000) Subject: changed the shortest path algorithm to support reverse search X-Git-Url: https://ruin.nu/git/?p=icfp05.git;a=commitdiff_plain;h=ea32d9ec2a34aa06cce2495c4efcb0864911be43 changed the shortest path algorithm to support reverse search --- diff --git a/bot/bot.cpp b/bot/bot.cpp index 7605cf1..713f190 100644 --- a/bot/bot.cpp +++ b/bot/bot.cpp @@ -21,41 +21,6 @@ Bot::Bot(const string& name, PlayerType type){ _playerTypes["robber"] = robber; _playerTypes["cop-foot"] = cop_foot; _playerTypes["cop-car"] = cop_car; - /* - priority_queue, vector >, VectComp> pq; - - vector v; - v.push_back("hej"); - pq.push(v); - v.push_back("hå"); - pq.push(v); - v.push_back("blaha"); - pq.push(v); - v.clear(); - v.push_back("hej hå"); - pq.push(v); - v.clear(); - v.push_back("hejsan"); - pq.push(v); - v.push_back("what?"); - pq.push(v); - v.push_back("blaha"); - pq.push(v); - - cerr << "Size: " << pq.top().size() << " " << pq.top()[0] << endl; - pq.pop(); - cerr << "Size: " << pq.top().size() << " " << pq.top()[0] << endl; - pq.pop(); - cerr << "Size: " << pq.top().size() << " " << pq.top()[0] << endl; - pq.pop(); - cerr << "Size: " << pq.top().size() << " " << pq.top()[0] << endl; - pq.pop(); - cerr << "Size: " << pq.top().size() << " " << pq.top()[0] << endl; - pq.pop(); - cerr << "Size: " << pq.top().size() << " " << pq.top()[0] << endl; - pq.pop(); - -*/ } @@ -255,7 +220,7 @@ struct SPInfoComp{ } }; -std::list Bot::shortestPath(const std::string& from, PlayerType type, const SPGoal& goal){ +std::list Bot::shortestPath(const std::string& from, PlayerType type, const SPGoal& goal, bool reverse){ //cerr << "New shortest path from: " << from << endl; @@ -270,6 +235,7 @@ std::list Bot::shortestPath(const std::string& from, PlayerType typ pq.push(node); int g = 0; + bool hascar = type == cop_car; while(!pq.empty()){ node = pq.top(); pq.pop(); @@ -295,9 +261,23 @@ std::list Bot::shortestPath(const std::string& from, PlayerType typ for (hash_map::const_iterator street = inter.connections.begin(); street != inter.connections.end(); ++street){ hash_map::iterator newNode = nodes.find(street->first); - bool hascar = type == cop_car; - if ( (hascar && (street->second == car || street->second == both)) || - (!hascar && (street->second == foot || street->second == both))){ + bool travelStreet = false; + if (hascar){ + if (reverse){ + if (street->second != foot){ + hash_map::const_iterator st = _intersections[street->first].connections.find(node->name); + if (st != _intersections[street->first].connections.end()) + travelStreet = st->second != foot; + else + travelStreet = false; + }else + travelStreet = true; + }else + travelStreet = street->second != foot; + }else{ + travelStreet = street->second != car; + } + if (travelStreet){ //cerr << "Adding street: " << street->first << endl; SPInfo* n = 0; if (newNode == nodes.end()){ diff --git a/bot/bot.h b/bot/bot.h index d01ec11..72d2d6b 100644 --- a/bot/bot.h +++ b/bot/bot.h @@ -83,7 +83,7 @@ class Bot { virtual std::string turn() = 0; void move(std::string location); void getPlayers(); - std::list shortestPath(const std::string& from, PlayerType type, const SPGoal& goal); + std::list shortestPath(const std::string& from, PlayerType type, const SPGoal& goal, bool reverse = false); __gnu_cxx::hash_map _intersections; __gnu_cxx::hash_map _players; diff --git a/robber/robber.cpp b/robber/robber.cpp index 0e0a265..4bc0400 100644 --- a/robber/robber.cpp +++ b/robber/robber.cpp @@ -36,8 +36,8 @@ string Robber::turn(){ double goodness = 0; Intersection& conInter = _intersections[street->first]; - list closestFootCop = shortestPath(street->first, cop_foot, FindPlayer(_players, cop_foot, 6)); - list closestCarCop = shortestPath(street->first, cop_car, FindPlayer(_players, cop_car, 5)); + list closestFootCop = shortestPath(street->first, cop_foot, FindPlayer(_players, cop_foot, 6), true); + list closestCarCop = shortestPath(street->first, cop_car, FindPlayer(_players, cop_car, 5), true); unsigned int closestCop = 0; bool copInCar = false;