Advertisement
Guest User

asdasd

a guest
Dec 15th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int TURN_PUSH = 0, TURN_MOVE = 1;
  6. const int MY_ID = 0, HIS_ID = 1;
  7.  
  8.  
  9. const int d_row[4] = {-1, 0, 1, 0};
  10. const int d_col[4] = {0, 1, 0, -1};
  11. const string dir_name[4] = {"UP", "RIGHT", "DOWN", "LEFT"};
  12.  
  13. bool is_vertical(int dir) {
  14. return dir == 0 || dir == 2;
  15. }
  16. bool is_horizontal(int dir) {
  17. return !is_vertical(dir);
  18. }
  19. int inv_dir(int dir) {
  20. return dir ^ 2;
  21. }
  22.  
  23. const int N = 7;
  24. string grid[N][N];
  25.  
  26. void read_grid() {
  27. for(int row = 0; row < N; ++row) {
  28. for(int col = 0; col < N; ++col) {
  29. cin >> grid[row][col];
  30. }
  31. }
  32. }
  33.  
  34. bool inside(int row, int col) {
  35. return 0 <= row && row < N && 0 <= col && col < N;
  36. }
  37.  
  38. bool can_go(int row, int col, int dir) {
  39. assert(0 <= dir && dir < 4);
  40. int r2 = row + d_row[dir];
  41. int c2 = col + d_col[dir];
  42.  
  43. return grid[row][col][dir] == '1'
  44. && inside(r2, c2) && grid[r2][c2][inv_dir(dir)] == '1';
  45. }
  46.  
  47. void read(pair<int,int>& p) {
  48. cin >> p.first >> p.second;
  49. }
  50.  
  51. struct Item {
  52. string name;
  53. int row, col;
  54. int player;
  55. void read() {
  56. cin >> name >> col >> row >> player;
  57. if (col < 0) {
  58. col = 0;
  59. row = 0;
  60. }
  61. }
  62. };
  63.  
  64. struct Player {
  65. int cntCards;
  66. int row, col;
  67. void read() {
  68. cin >> cntCards;
  69. cin >> col >> row;
  70. string this_cell;
  71. cin >> this_cell;
  72. }
  73. bool can_go(int dir) const {
  74. return ::can_go(row, col, dir);
  75. }
  76. void go(int dir) {
  77. assert(can_go(dir));
  78. row += d_row[dir];
  79. col += d_col[dir];
  80. }
  81. };
  82.  
  83. void print_moves(vector<int> dirs) {
  84. assert(!dirs.empty());
  85. cout << "MOVE";
  86. for(int dir : dirs) {
  87. cout << " " << dir_name[dir];
  88. }
  89. cout << endl;
  90. }
  91. void print_move(int dir) {
  92. print_moves({dir});
  93. }
  94.  
  95. int distance(pair<int,int> a, pair<int,int> b) {
  96. return abs(a.first - b.first) + abs(a.second - b.second);
  97. //bfs
  98. vector<pair<int,int>> q;
  99. q.push_back(a);
  100. vector<vector<bool>> visited(N, vector<bool>(N));
  101. vector<vector<int>> dist(N, vector<int>(N));
  102. visited[a.first][a.second] = true;
  103. for(int i = 0; i < (int) q.size(); ++i) {
  104. int row = q[i].first;
  105. int col = q[i].second;
  106. for(int dir = 0; dir < 4; ++dir) {
  107. if(can_go(row, col, dir)) {
  108. int r2 = row + d_row[dir];
  109. int c2 = col + d_col[dir];
  110. if(!visited[r2][c2]) {
  111. q.emplace_back(r2, c2);
  112. }
  113. }
  114. }
  115. }
  116. return dist[b.first][b.second];
  117. }
  118.  
  119. void component(pair<int,int> a, pair<int,int> goal) {
  120. vector<pair<int,int>> q;
  121. q.push_back(a);
  122. vector<vector<bool>> visited(N, vector<bool>(N));
  123. vector<vector<pair<int,int>>> previous_cell(N, vector<pair<int,int>>(N));
  124. visited[a.first][a.second] = true;
  125. for(int i = 0; i < (int) q.size(); ++i) {
  126. int row = q[i].first;
  127. int col = q[i].second;
  128. for(int dir = 0; dir < 4; ++dir) {
  129. if(can_go(row, col, dir)) {
  130. int r2 = row + d_row[dir];
  131. int c2 = col + d_col[dir];
  132. if(!visited[r2][c2]) {
  133. previous_cell[r2][c2] = {row, col};
  134. visited[r2][c2] = true;
  135. q.emplace_back(r2, c2);
  136. }
  137. }
  138. }
  139. }
  140. pair<int,int> best = a;
  141. for(pair<int,int> cell : q) {
  142. if(distance(cell, goal) < distance(best, goal)) {
  143. best = cell;
  144. }
  145. }
  146. vector<pair<int,int>> path;
  147. while(best != a) {
  148. path.push_back(best);
  149. best = previous_cell[best.first][best.second];
  150. }
  151. path.push_back(a);
  152. reverse(path.begin(), path.end());
  153. if((int) path.size() == 1) {
  154. cout << "PASS" << endl;
  155. return;
  156. }
  157. cout << "MOVE";
  158. for(int i = 0; i < (int) path.size() - 1; ++i) {
  159.  
  160. int row = path[i].first;
  161. int col = path[i].second;
  162. for(int dir = 0; dir < 4; ++dir) {
  163. int r2 = row + d_row[dir];
  164. int c2 = col + d_col[dir];
  165. if(make_pair(r2, c2) == path[i+1]) {
  166. cout << " " << dir_name[dir];
  167. }
  168. }
  169. }
  170. cout << endl;
  171. }
  172.  
  173. int main()
  174. {
  175.  
  176.  
  177. while (1) {
  178. int turnType;
  179. cin >> turnType; cin.ignore();
  180. read_grid();
  181. Player me, he;
  182. me.read();
  183. he.read();
  184. int numItems;
  185. cin >> numItems; cin.ignore();
  186. vector<Item> items(numItems);
  187. for(Item& item : items) {
  188. item.read();
  189. }
  190. int numQuests;
  191. cin >> numQuests; cin.ignore();
  192. pair<int,int> goal{-1, -1};
  193. for (int i = 0; i < numQuests; i++) {
  194. string questItemName;
  195. int questPlayerId;
  196. cin >> questItemName >> questPlayerId; cin.ignore();
  197. if(questPlayerId == MY_ID) {
  198. for(Item Item : items) {
  199. if(Item.name == questItemName && Item.player == MY_ID) {
  200. goal = make_pair(Item.row, Item.col);
  201. }
  202. }
  203. }
  204. }
  205.  
  206.  
  207. if(turnType == TURN_MOVE) {
  208. if(goal.first >= 0) {
  209. component({me.row, me.col}, goal);
  210. }
  211. else {
  212. vector<int> moves;
  213. for(int rep = 0; rep < 20; ++rep) {
  214. vector<int> order{0, 1, 2, 3};
  215. random_shuffle(order.begin(), order.end());
  216. for(int dir : order) {
  217. int r2 = me.row + d_row[dir];
  218. int c2 = me.col + d_col[dir];
  219. if(!me.can_go(dir)) {
  220. continue;
  221. }
  222. if(goal.first < 0 || distance(goal, {r2, c2}) < distance(goal, {r2, c2}) < distance(goal, {me.row, me.col}))
  223. moves.push_back(dir);
  224. me.go(dir);
  225. break;
  226. if(moves.empty())
  227. cerr << "can't move at all" << endl;
  228. cout << "PASS" << endl;
  229. }
  230. }
  231. }
  232. }
  233. else {
  234. if(true) {
  235. int dir = rand() % 4;
  236.  
  237. int which = me.row;
  238. if(is_vertical(dir)) {
  239. which = me.col;
  240. }
  241. cout << "PUSH " << which << " " << dir_name[dir] << endl;
  242. }
  243. else {
  244. if(me.row < goal.first) {
  245. cout << "PUSH " << me.col << " DOWN" << endl;
  246. }
  247. else if(me.row > goal.first) {
  248. cout << "PUSH " << me.col << " UP" << endl;
  249. }
  250. else if(me.col < goal.second) {
  251. cout << "PUSH " << me.row << " RIGHT" << endl;
  252. }
  253. else if(me.col > goal.second) {
  254. cout << "PUSH " << me.row << " LEFT" <<endl;
  255. }
  256. else {
  257. assert(false);
  258. }
  259. }
  260. }
  261. }
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement