| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [C&C++] Виртуальный робот в лабиринте |
| Автор: student117 17.8.2011, 01:43 | ||
| Робот идёт по лабиринту размером X на Y. Начинает всегда в координате (1,0) (т.е. (1,0) всегда коридор). labirint[x][y] == 0 - стена labirint[x][y] == 1 - коридор Выход - 1 на краю лабиринта. Программа должна выводить координаты маршрута в виду (x1,y1)(x2,y2)...(xN,yN) Пример: 0,1,0,0,0,0, 0,1,1,1,0,0, 0,0,0,1,1,0, 0,1,1,1,0,0, 0,1,0,1,1,0, 0,1,0,0,0,0, Решение: (1,0)(1,1)(2,1)(3,1)(3,2)(3,3)(2,3)(1,3)(1,4)(1,5) Предпочтения: Алгоритм должен быть как можно проще. Читабельность важнее производительности. Как можно меньше спецефичного С++ кода. Я довел это до:
Код находит нужное решение при вызове move_robot(1, 0). Моя проблема в том, что print_solution() выводит: (1,0)(1,1)(2,1)(3,1)(3,2)(1,3)(2,3)(3,3)(1,4)(1,5) Т.е. координаты "перепутаны", когда робот идёт с Запада на Восток. Аналогично будет если маршрут на выход будет с Юга на Север. Есть идеи? Сортировка? Или надо перерабатывать алгоритм? Спасибо. |
| Автор: t_gran 17.8.2011, 10:00 | ||
student117, всё довольно просто. Сохраняйте пройденный путь в стеке. Стек можете сами реализовать, либо воспользоваться STL. Вот что у меня получилось исходя из вашего кода:
Правда путь выводится в обратном порядке, но для этого есть очередь. Ведь так?! http://codepad.org/WZTMWtq0 |
| Автор: student117 17.8.2011, 11:16 |
| спасибо, t_gran не успел пока разобраться/вникнуть, но первая реакция: 1. Stack на STL может быть посчитан за C++. Предпочтение отдаётся коду с наименьшим спецфичным С++ синтаксисом. 2. По всей видимости код использует координаты выхода. Условием задачи координаты вызода не даны. |
| Автор: student117 17.8.2011, 14:24 | ||||
| да, стэк работает. в исходном коде на 25ой строке простое
и на 52ой
делают то что нужно. Разумеется по хорошему нужно делать StackPush(), StackPop(), IsStackFull(), IsStackEmpty() функционал. Просто добавлять эти строки не безопасно. t_gran, спасибо ещё раз за наводку. |
| Автор: Silent 17.8.2011, 16:06 | ||
Для поставленной задачи необходимо использовать другой алгоритм - поиск не в глубину, а в ширину:
легко переделывается в чистый С (мне так кажется, хотя ни разу его не знаю) |