Advertisement
marrruuuuuuuu

Untitled

Jan 12th, 2021
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.37 KB | None | 0 0
  1. // РЕАЛИЗАЦИЯ СБОРЩИКА ЯБЛОК
  2.  
  3. bool robot::shortest_coll(const int x_in_search,const int y_in_search,const int maximum_x,const int maximum_y, cell_value **tmp_map,just_map &god_map) {
  4. int tmp_rob_x = X + maximum_x;
  5. int tmp_rob_y = Y + maximum_y;
  6.  
  7. std::vector<r_search> reach_data;
  8.  
  9. for(auto & m : map.data){
  10. if(m.get_value() == APPLE){
  11. r_search new_cell;
  12. new_cell.set_X(m.get_X()+maximum_x);
  13. new_cell.set_Y(m.get_Y()+maximum_y);
  14. new_cell.set_value(APPLE);
  15. new_cell.set_to_go_point(abs(new_cell.get_X() - x_in_search)+abs(new_cell.get_Y() - y_in_search));
  16. reach_data.push_back(new_cell);
  17. }
  18. if(m.get_value() == EMPTY){
  19. r_search new_cell;
  20. new_cell.set_X(m.get_X()+maximum_x);;
  21. new_cell.set_Y(m.get_Y()+maximum_y);;
  22. new_cell.set_value(EMPTY);
  23. new_cell.set_to_go_point(abs(new_cell.get_X() - x_in_search)+abs(new_cell.get_Y() - y_in_search));
  24. reach_data.push_back(new_cell);
  25. }
  26. if(m.get_value() == ROBOT_COLLECTOR){
  27. r_search new_cell;
  28. new_cell.set_X(m.get_X()+maximum_x);;
  29. new_cell.set_Y(m.get_Y()+maximum_y);;
  30. new_cell.set_value(ROBOT_COLLECTOR);
  31. new_cell.set_to_go_point(abs(new_cell.get_X() - x_in_search)+abs(new_cell.get_Y() - y_in_search));
  32. reach_data.push_back(new_cell);
  33. }
  34. if(m.get_value() == ROBOT_SAPPER){
  35. r_search new_cell;
  36. new_cell.set_X(m.get_X()+maximum_x);;
  37. new_cell.set_Y(m.get_Y()+maximum_y);;
  38. new_cell.set_value(ROBOT_SAPPER);
  39. new_cell.set_to_go_point(abs(new_cell.get_X() - x_in_search)+abs(new_cell.get_Y() - y_in_search));
  40. reach_data.push_back(new_cell);
  41. }
  42. }
  43.  
  44.  
  45. std::vector<r_search> reachable;
  46.  
  47.  
  48.  
  49. add_siblings(tmp_rob_x, tmp_rob_y, 0, reach_data, reachable);
  50.  
  51.  
  52.  
  53. std::vector<r_search> explored;
  54.  
  55. for(int i = 0; i < reach_data.size(); i++){
  56. if(reach_data[i].get_value() == ROBOT_COLLECTOR){
  57. r_search new_cell;
  58. new_cell.set_X(reach_data[i].get_X());
  59. new_cell.set_Y(reach_data[i].get_Y());
  60. new_cell.set_value(reach_data[i].get_value());
  61. explored.push_back(new_cell);
  62. }
  63. }
  64.  
  65.  
  66.  
  67.  
  68.  
  69. bool trap;
  70. int x_to_find;
  71. int y_to_find;
  72. int itr = 1;
  73. bool is_reached = false;
  74. while(!is_reached){
  75. r_search tmp;
  76. tmp.set_to_go_point(1000);
  77. tmp.set_to_from_point(1000);
  78. tmp.set_from_to_sum(2000);
  79. for(auto & i : reachable){
  80. if(i.get_from_to_sum() <= tmp.get_from_to_sum()){
  81. if(!is_added(i.get_X(), i.get_Y(), explored)) {
  82. if (i.get_from_to_sum() == tmp.get_from_to_sum()) {
  83. if (i.get_to_go_point() < tmp.get_to_from_point()) {
  84. tmp = i;
  85. trap = false;
  86. }
  87. }
  88. if (i.get_from_to_sum() < tmp.get_from_to_sum()) {
  89. tmp = i;
  90. trap = false;
  91. }
  92. }
  93. }
  94. }
  95.  
  96. if(trap){
  97. reach_data.clear();
  98. reachable.clear();
  99. explored.clear();
  100. return false;
  101. }
  102.  
  103. explored.push_back(tmp);
  104. for (int i = 0; i < reachable.size(); i++){
  105. if(reachable[i].get_X() == tmp.get_X() && reachable[i].get_Y() == tmp.get_Y()){
  106. reachable.erase(reachable.begin() + i);
  107. }
  108. }
  109. add_siblings(tmp.get_X(), tmp.get_Y(), tmp.get_to_from_point(), reach_data, reachable);
  110.  
  111. if((abs(tmp.get_X() - x_in_search) + abs(tmp.get_Y() - y_in_search)) == 1){
  112. is_reached = true;
  113. }
  114.  
  115. itr++;
  116.  
  117. }
  118.  
  119.  
  120. // обратный путь по explored-у
  121. r_search tmp;
  122. r_search ex_tmp;
  123. for(auto & i : explored){
  124. if((abs(i.get_X() - x_in_search) + abs(i.get_Y()- y_in_search)) == 1){
  125. tmp = i;
  126. }
  127. }
  128.  
  129. std::vector<auto_command> way_out;
  130. int iterator = 1;
  131.  
  132. while(tmp.get_X() != tmp_rob_x || tmp.get_Y() != tmp_rob_y){
  133. take_step_back(iterator, tmp, way_out);
  134. for (int i = 0; i < explored.size(); i++){
  135. if(explored[i].get_X() == tmp.get_previous_x() && explored[i].get_Y() == tmp.get_previous_y()){
  136. ex_tmp.set_value(tmp.get_value());
  137. ex_tmp.set_X(tmp.get_X());
  138. ex_tmp.set_Y(tmp.get_Y());
  139. tmp = explored[i];
  140. }
  141. }
  142. iterator++;
  143.  
  144. }
  145.  
  146.  
  147.  
  148.  
  149. if(ex_tmp.get_value() == ROBOT_SAPPER){
  150. reachable.clear();
  151. explored.clear();
  152. way_out.clear();
  153. if(is_blocked(x_in_search, y_in_search, maximum_x, maximum_y, tmp_map)){
  154. return false;
  155. }
  156.  
  157. add_siblings(tmp_rob_x, tmp_rob_y, 0, reach_data, reachable);
  158.  
  159.  
  160.  
  161. for(int i = 0; i < reach_data.size(); i++){
  162. if(reach_data[i].get_value() == ROBOT_COLLECTOR){
  163. r_search new_cell;
  164. new_cell.set_X(reach_data[i].get_X());
  165. new_cell.set_Y(reach_data[i].get_Y());
  166. new_cell.set_value(reach_data[i].get_value());
  167. explored.push_back(new_cell);
  168. }
  169. }
  170.  
  171.  
  172.  
  173. trap = true;
  174. itr = 1;
  175. is_reached = false;
  176. int counter = 0;
  177. while(!is_reached){
  178. if (counter == 25){
  179. reachable.clear();
  180. explored.clear();
  181. way_out.clear();
  182. return false;
  183. }
  184. tmp.set_to_go_point(1000);
  185. tmp.set_to_from_point(1000);
  186. tmp.set_from_to_sum(2000);
  187. for(auto & i : reachable){
  188. if(i.get_from_to_sum() <= tmp.get_from_to_sum() && i.get_value() != ROBOT_SAPPER){
  189. if(!is_added(i.get_X(), i.get_Y(), explored)) {
  190. if (i.get_from_to_sum() == tmp.get_from_to_sum()) {
  191. if (i.get_to_go_point() < tmp.get_to_from_point()) {
  192. tmp = i;
  193. trap = false;
  194. }
  195. }
  196. if (i.get_from_to_sum() < tmp.get_from_to_sum()) {
  197. tmp = i;
  198. trap = false;
  199. }
  200. }
  201. }
  202. }
  203. if(trap){
  204. reach_data.clear();
  205. reachable.clear();
  206. explored.clear();
  207. way_out.clear();
  208. return false;
  209. }
  210. counter++;
  211.  
  212.  
  213. explored.push_back(tmp);
  214. for (int i = 0; i < reachable.size(); i++){
  215. if(reachable[i].get_X() == tmp.get_X() && reachable[i].get_Y() == tmp.get_Y()){
  216. reachable.erase(reachable.begin() + i);
  217. }
  218. }
  219. add_siblings(tmp.get_X(), tmp.get_Y(), tmp.get_to_from_point(), reach_data, reachable);
  220.  
  221. if((abs(tmp.get_X() - x_in_search) + abs(tmp.get_Y() - y_in_search)) == 1){
  222. is_reached = true;
  223. }
  224.  
  225. itr++;
  226.  
  227. }
  228.  
  229.  
  230. // обратный путь по explored-у
  231. for(auto & i : explored){
  232. if((abs(i.get_X() - x_in_search) + abs(i.get_Y()- y_in_search)) == 1){
  233. tmp = i;
  234. }
  235. }
  236.  
  237. iterator = 1;
  238.  
  239. while(tmp.get_X() != tmp_rob_x || tmp.get_Y() != tmp_rob_y){
  240. take_step_back(iterator, tmp, way_out);
  241. for (int i = 0; i < explored.size(); i++){
  242. if(explored[i].get_X() == tmp.get_previous_x() && explored[i].get_Y() == tmp.get_previous_y()){
  243. tmp = explored[i];
  244. }
  245. }
  246. iterator++;
  247.  
  248. }
  249. }
  250.  
  251.  
  252.  
  253.  
  254.  
  255. iterator--;
  256. for(int i = 0; i < way_out.size(); i++){
  257. if(way_out[i].get_idx() == iterator){
  258. move(way_out[i].get_value(), god_map);
  259. }
  260. }
  261.  
  262. reach_data.clear();
  263. reachable.clear();
  264. explored.clear();
  265. way_out.clear();
  266. return true;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement