Advertisement
Guest User

Untitled

a guest
Oct 21st, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.20 KB | None | 0 0
  1. // Example program
  2. #include <iostream>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. // Размеры лабиринта
  8. const int WIDTH = 7;
  9. const int HEIGHT = 7;
  10.  
  11.  
  12. // Массив лабиринта 0 - свободно, 1 - стена
  13. char labirint[WIDTH][HEIGHT] = {
  14. {'0','0','0','0','0','1','0'},
  15. {'0','1','1','1','0','1','0'},
  16. {'0','0','0','1','1','1','1'},
  17. {'0','1','0','0','0','0','0'},
  18. {'1','1','1','1','0','0','0'},
  19. {'0','0','0','0','0','1','0'},
  20. {'0','0','0','0','0','1','0'},
  21.  
  22. };
  23.  
  24.  
  25. // Точки финиша и старта
  26. int start[2] = {0,0};
  27. int finish[2] = {WIDTH-1,HEIGHT-1};
  28.  
  29.  
  30. // Функция проверяющая, находится ли точка внутри лабиринта
  31. bool isExist(int row, int column){
  32. if(row >= 0 && row < HEIGHT && column >= 0 && column < WIDTH){
  33. return true;
  34. } else {
  35. return false;
  36. }
  37. };
  38.  
  39.  
  40. // Данные о том, за какое минимальное кол-во шагов можно попасть в клетку [i,j]
  41. int info_steps[WIDTH][HEIGHT];
  42.  
  43. // Выводит информацию о поле (сколько нужно шагов до каждой клетки)
  44. void printData(){
  45. for(int i = 0; i<HEIGHT; i++){
  46. cout << endl;
  47. for(int j = 0; j<WIDTH; j++){
  48. // Устанавливаем ширину выводимого потока (3 символа) для цифр и знака минус
  49. cout.width(3);
  50. cout << info_steps[i][j] << " ";
  51. }
  52. }
  53.  
  54. cout << endl << endl;
  55. };
  56.  
  57. // Распечатать лабиринт
  58. void printLabirint(){
  59. for(int i = 0; i<HEIGHT; i++){
  60. cout << endl;
  61. for(int j = 0; j<WIDTH; j++){
  62. // Устанавливаем ширину выводимого потока (3 символа) для цифр и знака минус
  63. cout.width(1);
  64. cout << labirint[i][j] << " ";
  65. }
  66. }
  67.  
  68. cout << endl << endl;
  69. };
  70.  
  71. // Распечатать путь
  72. void printPath(){
  73. // Шаги, за которое можно добраться от начала до финиша
  74. int steps = info_steps[finish[0]][finish[1]];
  75.  
  76. // Берём финишную точку и начинаем высчитывать путь
  77. int point[2] = {finish[0], finish[1]};
  78.  
  79. // Чем будем помечать путь
  80. char mark = '*';
  81.  
  82. // Помечаем её
  83. labirint[point[0]][point[1]] = mark;
  84.  
  85.  
  86. for(int s = steps; s>0; s--){
  87.  
  88. // Проверяем, существует ли точка сверху
  89. if(isExist(point[0]-1, point[1])){
  90. // Можно ли добраться в эту точку сверху?
  91. if(info_steps[point[0]-1][point[1]] == s-1){
  92. labirint[point[0]-1][point[1]] = mark;
  93. // Берём эту точку как текущую
  94. point[0] = point[0]-1;
  95. point[1] = point[1];
  96. continue;
  97. }
  98. }
  99.  
  100. // Проверяем, существует ли точка снизу
  101. if(isExist(point[0]+1, point[1])){
  102. // Можно ли добраться в эту точку сверху?
  103. if(info_steps[point[0]+1][point[1]] == s-1){
  104. labirint[point[0]+1][point[1]] = mark;
  105. // Берём эту точку как текущую
  106. point[0] = point[0]+1;
  107. point[1] = point[1];
  108. continue;
  109. }
  110. }
  111.  
  112. // Проверяем, существует ли точка слева
  113. if(isExist(point[0], point[1]-1)){
  114. // Можно ли добраться в эту точку сверху?
  115. if(info_steps[point[0]][point[1]-1] == s-1){
  116. labirint[point[0]][point[1]-1] = mark;
  117. // Берём эту точку как текущую
  118. point[0] = point[0];
  119. point[1] = point[1]-1;
  120. continue;
  121. }
  122. }
  123.  
  124. // Проверяем, существует ли точка справа
  125. if(isExist(point[0], point[1]+1)){
  126. // Можно ли добраться в эту точку сверху?
  127. if(info_steps[point[0]][point[1]+1] == s-1){
  128. labirint[point[0]][point[1]+1] = mark;
  129. // Берём эту точку как текущую
  130. point[0] = point[0];
  131. point[1] = point[1]+1;
  132. continue;
  133. }
  134. }
  135.  
  136. }
  137.  
  138. // Выводим лабиринт с путём
  139. printLabirint();
  140.  
  141. }
  142.  
  143.  
  144. int main()
  145. {
  146.  
  147. // Выводим лабиринт
  148. printLabirint();
  149.  
  150. // Заполняем data -1
  151. for(int i = 0; i<HEIGHT; i++){
  152. for(int j = 0; j<WIDTH;j++){
  153. info_steps[i][j] = -1;
  154. }
  155. }
  156.  
  157.  
  158.  
  159. // Массив из новых точек
  160. int points[WIDTH*HEIGHT][2];
  161. int points_count = 0;
  162.  
  163. // Добавляем точку старта
  164. points[points_count][0] = start[0];
  165. points[points_count][1] = start[1];
  166. points_count++;
  167.  
  168.  
  169.  
  170. // Пока searching == true - ищем
  171. bool searching = true;
  172. int iter = 0;
  173. while(searching){
  174.  
  175. // Массив точек, полученных на этой итерации
  176. int points_new[WIDTH*HEIGHT][2];
  177. int points_new_count = 0;
  178.  
  179. // Проходимся по всем точкам
  180. for(int i = 0; i<points_count; i++){
  181.  
  182. // Строка и колонка лабиринта
  183. int row = points[i][0];
  184. int column = points[i][1];
  185.  
  186. // Ставим минимальное количество шагов для точки
  187. info_steps[row][column] = iter;
  188.  
  189.  
  190. // Проверка конца лабиринта
  191. if(row == finish[0] && column == finish[1]){
  192. cout << "Path was found!" << endl;
  193. printData();
  194. printPath();
  195. searching = false;
  196. break;
  197. }
  198.  
  199.  
  200. // Проверяем выше точки
  201. if(isExist(row-1, column)){
  202. // В данной точке не стена
  203. if(labirint[row-1][column] == '0'){
  204. // Мы ещё не были в данной точке
  205. if(info_steps[row-1][column] == -1){
  206. points_new[points_new_count][0] = row-1;
  207. points_new[points_new_count][1] = column;
  208. points_new_count++;
  209. }
  210. }
  211. }
  212.  
  213. // Проверяем ниже точки
  214. if(isExist(row+1, column)){
  215. // В данной точке не стена
  216. if(labirint[row+1][column] == '0'){
  217. // Мы ещё не были в данной точке
  218. if(info_steps[row+1][column] == -1){
  219. points_new[points_new_count][0] = row+1;
  220. points_new[points_new_count][1] = column;
  221. points_new_count++;
  222. }
  223. }
  224. }
  225.  
  226. // Проверяем правее точки
  227. if(isExist(row, column+1)){
  228. // В данной точке не стена
  229. if(labirint[row][column+1] == '0'){
  230. // Мы ещё не были в данной точке
  231. if(info_steps[row][column+1] == -1){
  232. points_new[points_new_count][0] = row;
  233. points_new[points_new_count][1] = column+1;
  234. points_new_count++;
  235. }
  236. }
  237. }
  238.  
  239. // Проверяем левее точки
  240. if(isExist(row, column-1) ){
  241. // В данной точке не стена
  242. if(labirint[row][column-1] == '0'){
  243. // Мы ещё не были в данной точке
  244. if(info_steps[row][column-1] == -1){
  245. points_new[points_new_count][0] = row;
  246. points_new[points_new_count][1] = column-1;
  247. points_new_count++;
  248. }
  249. }
  250. }
  251. }
  252.  
  253.  
  254.  
  255. // Записываем данные новых найденных точек в общий массив точек
  256. // Для их проверки на следующем шаге
  257. points_count = points_new_count;
  258. memcpy(&points[0], &points_new[0], sizeof(int)*2*points_new_count);
  259.  
  260. // Если везде тупики
  261. if(points_new_count == 0){
  262. cout << "No path!" << endl;
  263. searching = false;
  264. break;
  265. }
  266.  
  267.  
  268. // Делаем шаг дальше
  269. iter++;
  270. if(iter >= 25){
  271. break;
  272. }
  273. }
  274.  
  275. // Остановка экрана
  276. cin.get();
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement