Advertisement
Guest User

Untitled

a guest
Feb 13th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. #include "AI.h"
  2.  
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cstdlib>
  6. #include <iostream>
  7.  
  8. const int inf = 1e9;
  9. const int M = 150;
  10.  
  11.  
  12. int n;
  13.  
  14. bool bad [M];
  15. vector< vector<int> > g;
  16. vector< vector<int> > dd;
  17. vector< vector<int> > pp;
  18. vector<int> owner;
  19. vector<int> monsters;
  20. vector<int> myNodes;
  21. vector<int> hisNodes;
  22. vector<int> freeNodes;
  23.  
  24. vector<int> freeV;
  25.  
  26.  
  27. void AI::buildGraph(World *world) {
  28. cerr<<"Building graph"<<endl;
  29. g = vector< vector<int> >(M);
  30. std::vector<Node*>& allNodes = world->getMap()->getNodes();
  31. n = allNodes.size();
  32. owner = vector<int>(M);
  33. monsters = vector<int>(M);
  34. myNodes.clear();
  35. hisNodes.clear();
  36. freeNodes.clear();
  37.  
  38. for(auto& v : allNodes)
  39. {
  40. const std::vector<Node*>& neighbours = v->getNeighbours();
  41.  
  42. // cerr<<v->getIndex()<<": ";
  43. for( auto& u : neighbours){
  44. g[v->getIndex()].push_back(u->getIndex());
  45. // cerr<<u->getIndex()<<" ";
  46. }
  47. // cerr<<endl;
  48.  
  49. owner[v->getIndex()] = v->getOwner();
  50. if( owner[v->getIndex()] != -1 ){
  51. owner[v->getIndex()] = (v->getOwner() == world->getMyId());
  52. if(owner[v->getIndex()])
  53. myNodes.push_back(v->getIndex());
  54. else
  55. hisNodes.push_back(v->getIndex());
  56. }
  57. else{
  58. freeNodes.push_back(v->getIndex());
  59. }
  60. monsters[v->getIndex()] = v->getArmyCount();
  61.  
  62. cerr<<v->getIndex()<<" Monsters: "<<monsters[v->getIndex()]<<" Owner: "<<v->getOwner()<<" "<<world->getMyId()<<endl;
  63. }
  64.  
  65. dd = vector< vector<int> >(M, vector<int>(M) );
  66. pp = vector< vector<int> >(M, vector<int>(M) );
  67.  
  68. for( int v = 0; v < n; v++ ){
  69. for( int u = 0; u < n; u++ )
  70. dd[v][u] = inf;
  71. for( int u : g[v] ){
  72. dd[v][u] = 1;
  73. pp[v][u] = u;
  74. }
  75. }
  76.  
  77.  
  78.  
  79. for( int t = 0; t < n; t++)
  80. for( int v = 0; v < n; v++ )
  81. for( int u = 0; u < n; u++ ){
  82. if( dd[v][u] > dd[v][t] + dd[t][u] ){
  83. dd[v][u] = dd[v][t] + dd[t][u];
  84. pp[v][u] = pp[v][t];
  85. }
  86. }
  87. }
  88.  
  89. int was [M];
  90.  
  91. void AI::dfs(int v){
  92. was[v] = 1;
  93. if(owner[v]==-1) freeV.push_back(v);
  94. for( int to : g[v] ){
  95. if(was[to]==1 || owner[to]==0) continue;
  96. dfs(to);
  97. }
  98. }
  99.  
  100. void AI::reachableFree(World *world){
  101. freeV.clear();
  102. for( int i = 0; i < n; i++ ){
  103. if(owner[i] == 1 && !was[i]){
  104. dfs(i);
  105. }
  106. }
  107. }
  108.  
  109. void AI::doTurn(World *world)
  110. {
  111. cerr<<"===================="<<endl;
  112. for( int i = 0; i < n; i++ ) bad[i] = 0;
  113. buildGraph(world);
  114. /** Fill this method. We've presented a stupid AI as an example! **/
  115. /*std::vector<Node*>& allNodes = world->getMap()->getNodes();
  116. for(auto& kek : allNodes){
  117. cerr<<kek->getOwner()<<" "<<kek->getArmyCount()<<endl;
  118. }
  119. cerr<<"==========================="<<endl;*/
  120. for( int v : myNodes ){
  121. for( int u : g[v] ){
  122. if(monsters[v]==0) break;
  123. if(owner[u]==-1){
  124. world->moveArmy(v,u,monsters[v]);
  125. monsters[v]--;
  126. bad[v] = 1;
  127. cerr<<"Scout from "<<v<<" to "<<u<<endl;
  128.  
  129. break;
  130. }
  131. }
  132. }
  133.  
  134. vector<int> closest (M);
  135.  
  136. int myTotalArmy = 0;
  137. int crucialDst = inf;
  138. for( int v : myNodes ){
  139. closest[v] = inf;
  140. if(!bad[v])
  141. myTotalArmy += monsters[v];
  142. for( int i = 0; i < n; i++ ){
  143. if( owner[i]==0 ){
  144. closest[v] = min( closest[v], dd[v][i] );
  145. crucialDst = min( crucialDst, closest[v] );
  146. }
  147. }
  148. cerr<<v<<" closest is "<<closest[v]<<" afar."<<endl;
  149. }
  150.  
  151. vector<int> crucialP;
  152. cerr<<"Crucial: ";
  153. for( int v : myNodes ){
  154. if(closest[v] != crucialDst)
  155. continue;
  156. crucialP.push_back(v);
  157. cerr<<v<<" ";
  158. }
  159. cerr<<endl;
  160.  
  161. int crucialMonsters = myTotalArmy / max(1, (int)crucialP.size());
  162.  
  163. cerr<<"CrucialMonsters "<<crucialMonsters<<endl;
  164.  
  165. vector<int> need (M);
  166. cerr<<"Need: ";
  167. for( int v : crucialP ){
  168. need[v] = max(0, crucialMonsters - monsters[v]);
  169. cerr<<need[v]<<" ";
  170. }
  171. cerr<<endl;
  172.  
  173.  
  174. for( int v : myNodes ){
  175. if(crucialP.empty()) break;
  176. if( closest[v]==crucialDst ) continue;
  177. if(bad[v]) continue;
  178.  
  179. for( int u : g[v] ){
  180. if(closest[u] < closest[v]){
  181. world->moveArmy(v,u,monsters[v]);
  182. bad[v] = 1;
  183. break;
  184. }
  185. }
  186. bad[v] = 1;
  187. }
  188. for( int v : crucialP ){
  189. if( bad[v] ) continue;
  190. int myClass = 0;
  191. if(monsters[v]>10) myClass = 1;
  192. if(monsters[v]>30) myClass = 2;
  193. for( int u : g[v] ){
  194. if(owner[u]==0 && monsters[u] <= myClass ){
  195. world->moveArmy(v,u,monsters[v]);
  196. bad[v] = 1;
  197. break;
  198. }
  199. }
  200.  
  201. }
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement