Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22

Робот, сажающий грядки

21.12.2017, 23:18. Показов 8613. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая среда "Исполнители", написанная питерским учителем. Там встроена черепашка, рисовалка и робот - вспомогательные инструменты для обучения новичков алгоритмизации. Также есть билингвальный интерпретатор кода, отдаленно похожий на си.

Так вот, задали подруге задачку, чтобы робот мог пройти карту из минимум 5 грядок и 6 стен (минимальное поле в программе 10x10), посадив всё грядки и вернувшись на базу. Фишка в том, что робот должен это сделать из любой точки на карте, с любого поворота. Высший пилотаж - написать такого робота, который сможет произвольный лабиринт обходить из любой точки.

Робот плохо умеет ориентироваться в пространстве. Он лишь "видит" что по 4м соседним кледкам от него - препятствие/клумба/пустота. И что под ним - грядка или база. Умеет вращаться на 90/180 и ходить вперед-назад (это для тех, кто не знаком или не планирует знакомиться со средой)

Если робот сориентирован строго на север, то написать алгоритм для обхода несложного "лабиринта" довольно легко. А вот когда его начинают располагать произвольно повернув, появляются проблемы.

Мне стыдно, что я, пусть и давно, окончил матфак и прикладную информатику, но такая программа поставила меня в тупик.
Если кто-то готов поделиться идеями и/или наработками, буду душевно признателен
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2017, 23:18
Ответы с готовыми решениями:

Робот сажающий грядки. Минимум кода!
Есть лабиринт такого типа (может быть любых размеров) Нужно, что бы робот находясь напротив стены в любой точке, дошел до стены и...

Сколько дачников приземлится на свои грядки?
Помогите решить. Некое садоводческое товарищество располагается на острове, а дачники добираются до него самолетом. Высадиться на остров...

Записи с вариантами: Вычислить средний вес урожая с грядки для каждого дачника
1. Для каждого дачника даны сведения: фамилия, название овоща и урожай с каждой из пяти грядок. a. Создать массив записей дачников. ...

19
21.12.2017, 23:26

Не по теме:

Цитата Сообщение от eXpressionist Посмотреть сообщение
задали подруге задачку
я конечно не в тему, а простите, ваша подруга сама в состоянии зарегистрироваться на форуме и задать этот вопрос?
зачем посредник в виде "сломанного радио" в виде вас?

0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
21.12.2017, 23:38
Цитата Сообщение от eXpressionist Посмотреть сообщение
Если робот сориентирован строго на север, то написать алгоритм для обхода несложного "лабиринта" довольно легко.
Поверните лабиринт вместе роботом так, чтобы робот стал сориентирован строго на север.
0
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22
21.12.2017, 23:43  [ТС]

Не по теме:

А в чем сломанное радио? Задачу я пересказал в целости. Решать её буду я. Мог бы и не рассказывать это отступление от темы, но кому-то показалось бы странным, что раньше человек спрашивал про delphi, а теперь спрашивает про практически школьную среду. Или подумали бы, что решаю задачу за деньги.

Скажем так, она хороший студент по большинству предметов, но по информатике - слабовата. Проходить будут её всего 1 семестр и сразу экзамен. В школе информатику они почти не учили, а в вузе попался суровый препод.



Shamil1, среда не позволяет вращать лабиринт. Он рисуется на отдельном поле.
[img]https://i.**********/ZN5cBLe.png[/img]
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
22.12.2017, 01:17
Цитата Сообщение от eXpressionist Посмотреть сообщение
среда не позволяет вращать лабиринт. Он рисуется на отдельном поле.
Насколько я понял из Вашего описания, робот может ходить только вперёд и назад. Так что можете считать, что в начальный момент он смотрит на север.
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
22.12.2017, 01:28
В приведенном на рисунке лабиринте можно сориентироваться следующим образом:
- двигаясь по диагонали "вперед и вправо" дойти до угла, это возможно, т.к. стены не образуют тупиковых и угловых карманов ни в одном направлении. Т.е. пока впереди не стена и свободно, двигаемся вперед, как только дошли до стены или конца доски, поворачиваем вправо и двигаемся вперед, когда дошли до следующей стены, поворачиваем влево, потом опять вправо и т.д. пока не окажемся в углу.
- двигаемся вдоль края доски до стены или следующего угла
- если дошли до края не встретив стены, двигаемся вдоль следующего края
- если дошли до стены, то т.к. стен вдоль края всего три, то определить в какую из них уперлись не составляет сложности.

как только определили положение робота, перемещение по любой траектории в любую точку задается линейным алгоритмом.
0
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22
22.12.2017, 09:52  [ТС]
Sindbad_M, а как робот определит положение? Можно (если впереди_стена и слева_стена), но тут есть ряд сложностей.. Он может оказаться в любом из углов, и это всё ломает.
Пока решил, что самое оптимальное решение - считерить с картой, упростив её максимально.
[img]https://i.**********/l7br3aB.png[/img]
Сделать так, чтобы не только в угол приехал, но именно на базу, использовав её как точку старта. Оттуда обход можно как по горизонтали, так и по вертикали пройти (в зависимости, как он будет повернут изначально).
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
22.12.2017, 10:18
Цитата Сообщение от eXpressionist Посмотреть сообщение
Он может оказаться в любом из углов, и это всё ломает.
именно, в любом из углов, но ничего это не ломает.
Итак, робот находится в каком-то углу и известны два направления движения вдоль края. Робот двигается вдоль одного из краев. Возможны варианты:
1. дошли до следующего угла не встретив стены. Тогда продолжаем обходить доску вдоль следующего края
2. На первом шаге уперлись в стену, значит мы в ячейке К10 (координаты называю как в "Морском бое"), т.е. положение определено
3. На восьмом шаге уперлись в стену, значит мы в ячейке К8, т.е. положение определено
4. На третьем шаге уперлись в стену, конец доски справа, значит мы в ячейке Ж1, т.е. положение определено
5. На третьем шаге уперлись в стену, конец доски слева, значит мы в ячейке Г1, т.е. положение определено
0
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22
22.12.2017, 11:27  [ТС]
Sindbad_M, если брать пример, который я дал наверху, то он ведь может с любой стороны там оказаться. И линейным алгоритмом оттуда уже не поедешь, поскольку робот неверно сосчитает координаты.
В том примере вообще из-за препятствий, подобных углу, невозможно гарантированно попасть в угол.
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
22.12.2017, 12:02
находясь в любом углу мы уже можем определить как хотим обходить поле - по часовой или против часовой стрелки, таким образом, возможные встречи с блоками сокращаются с четырех вариантов до двух.

Добавлено через 1 минуту
Цитата Сообщение от eXpressionist Посмотреть сообщение
Sindbad_M, если брать пример, который я дал наверху, то он ведь может с любой стороны там оказаться.
В тот момент когда становится определенным местонахождение робота, становится определенной и его ориентация.

Добавлено через 32 минуты
Цитата Сообщение от eXpressionist Посмотреть сообщение
В том примере вообще из-за препятствий, подобных углу, невозможно гарантированно попасть в угол.
действительно, достигнув края, робот может попасть в "карман", образованный краем доски и одной из трех стен. Либо нужно усложнить алгоритм, добавив обход этих карманов. Либо сразу пытаться определить по другим признакам какую из трех стен достигли.
0
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22
22.12.2017, 15:26  [ТС]
Цитата Сообщение от Sindbad_M Посмотреть сообщение
В тот момент когда становится определенным местонахождение робота
Вот как в одном встроенном примере запоминают расположение базы:
Кликните здесь для просмотра всего текста

ПроверитьРяд
{
yy = 0;
пока ( впереди_свободно )
{
вперед ( 1 );
yy = yy + 1;
}
ПроверитьКлетку;
пока ( сзади_свободно )
{
назад ( 1 );
yy = yy - 1;
ПроверитьКлетку;
}
}
/*---------------------*/
ПроверитьКлетку
{
если ( грядка )
посади;
если ( база )
{
x = xx;
y = yy;
}
}

//xx у них прирастает в самом теле программы, по условию (пока справа_свободно) <код> xx=x+1;

Цитата Сообщение от Sindbad_M Посмотреть сообщение
На третьем шаге уперлись в стену, конец доски справа, значит мы в ячейке Ж1, т.е. положение определено
Робот не знает, что конец справа. А запоминание ячеек будет характерно только если начинать с определенного угла в определенном направлении. Выходит, главная задача - научить робота доезжать с любой точки до старта, а оттуда действительно можно хоть линейным алгоритмом катиться. Хотя это и тупо)
Была идея хранить координаты в матрице, но среда не умеет в рамках процедур и функций передавать значения в массивах по адресу.

В принципе, для очень легкого лабиринта я задачу уже решил.
Но он у меня просто долбится в стенку, и возвращается. Если бы я расположил грядки за стенками, то я пока не придумал, как выкручиваться.
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
22.12.2017, 16:33
Цитата Сообщение от eXpressionist Посмотреть сообщение
Робот не знает, что конец справа.
Как не знает? Если проверка (справа свободно) будет ложной и одновременно проверка (справа стена) тоже будет ложной, то, как я понимаю, это и должно являться признаком конца доски справа. Вообще оставлять ли конец доски по левую или по правую руку движения робота вдоль края - выбор программиста. Если обходим так, что конец доски справа - обходим против часовой стрелки, в другую сторону - по часовой стрелке.

Цитата Сообщение от eXpressionist Посмотреть сообщение
Выходит, главная задача - научить робота доезжать с любой точки до старта, а оттуда действительно можно хоть линейным алгоритмом катиться.
Именно. Это основной путь решения задач с заранее заданным лабиринтом. Шаг первый - понять где находится и как развернут робот. Шаг второй - выполнить требуемые действия.

А ИИ все равно слишком трудоемок для курса "основы информатики". Алгоритм для заранее неизвестного лабиринта должен быть таким:
1. Обойти всю доску, сформировав в памяти карту лабиринта
2. Проанализировать карту, составив схему обхода для выполнения задания
3. Выполнить действия
Пункты 1 и 2 каждый представляет собой хорошую олимпиадную задачу. Учтите, существуют лабиринты, для которых порядок высадки клумб важен, т.к. робот может сам себе заблокировать единственный выход.
И все равно написать такой ИИ на практике не получится из-за ограничений языка и среды - отсутствуют динамические структуры данных, отсутствуют указатели, медленный интерпретатор не даст за разумное время реализовать перебор ходов.
0
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22
22.12.2017, 16:38  [ТС]
Цитата Сообщение от Sindbad_M Посмотреть сообщение
Если проверка (справа свободно) будет ложной и одновременно проверка (справа стена)
увы, в этой среде граница является стеной
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
22.12.2017, 16:46
Цитата Сообщение от eXpressionist Посмотреть сообщение
увы, в этой среде граница является стеной
Ну не проблема же. Принцип-то понятен?
В вашем случае стены образуют углы только между границей доски и стеной к ней примыкающей, т.е. углов внутри доски нет. Как только достигнем какого-нибудь угла, пара шагов в сторону и становится понятно, это угол границ доски или угол между границей и стеной. Как только определили что найденная стена это не стена а граница доски, можем двигаться либо оставляя её по правую руку (против часовой), либо по левую руку (по часовой стрелке).
0
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22
22.12.2017, 17:11  [ТС]
Цитата Сообщение от Sindbad_M Посмотреть сообщение
Принцип-то понятен?
да, в целом, когда тут начал рассуждать, стало яснее.
Спасибо за участие
0
Айлурофил
 Аватар для Massaraksh7
511 / 445 / 111
Регистрация: 27.05.2017
Сообщений: 2,667
Записей в блоге: 5
22.12.2017, 21:10
Цитата Сообщение от magirus Посмотреть сообщение

Не по теме:


я конечно не в тему, а простите, ваша подруга сама в состоянии зарегистрироваться на форуме и задать этот вопрос?
зачем посредник в виде "сломанного радио" в виде вас?

Не по теме:

Так, понятно, что тогда придётся перед ней признаться, что сам не может решить. А это обидно.

0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
23.12.2017, 03:09
Робот легко может посетить все доступные клетки и нарисовать карту.
0
 Аватар для eXpressionist
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 22
23.12.2017, 18:44  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Робот легко может посетить все доступные клетки и нарисовать карту.
вы думаете, реально нарисовать карту без использования функций? так вот, как я сказал ранее, среда за пределы функций не передает содержимое массивов. скажем, быстрая сортировка с рекурсией в ней не работает.

Не по теме:

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
понятно, что тогда придётся перед ней признаться, что сам не может решить. А это обидно.
я признался, что спрошу совета у опытных людей, если сам не решу)



Задача зачтена уже, в простом виде. Просто я не представляю до сих пор возможность сделать её с бонусными баллами - обходящую произвольный лабиринт.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
23.12.2017, 21:52
Цитата Сообщение от eXpressionist Посмотреть сообщение
среда за пределы функций не передает содержимое массивов
Можно использовать глобальные переменные.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
27.12.2017, 14:53
Лучший ответ Сообщение было отмечено eXpressionist как решение

Решение

Посмотрел я эту среду. Всё в ней можно написать, хотя и не совсем удобно.
Для примера я реализовал алгоритм нахождения кратчайшего пути А* с приоритетной очередью на основе бинарной пирамиды.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Находим кратчайший путь между заданными клетками
cell_path(int p1, int p2)
{
    int dir;
    path_len = 0;
    vertices_len = 0;
    heap_len = 0;
    vertices_add_pos(p1, p2, 0, FROM_PARENT, DIR_NONE);
    while(heap_len > 0)
    {
        int node = heap_remove_max();
        int index = heap_get_index(heap_remove_max());
        int vertex = vertices[index];
        int curr_pos = vertex_get_pos(vertex);
        if(curr_pos == p2)
        {
            path_restore(vertex);
            break;
        }
        int dist = vertex_get_distance(vertex);
        for(dir = 0; dir < DIR_BOUND; dir = dir + 1)
        {                                                                      
            int next_pos = pos_add1(curr_pos, dir);
            int cell_index = cells_find_by_pos(next_pos);
            if(cell_index < 0)
                continue;
            int type = cell_get_type(cells[cell_index]);
            if(type >= CELL_EMPTY | type == CELL_FREE)
                vertices_add_pos(next_pos, p2, dist + 1, index, dir);
        }
    }
}
 
// Добавляем вершину в граф для поиска кратчайшего пути
vertices_add_pos(int position, int dest_position, int distance, int parent, int direction)
{
    int index = vertices_find_by_pos(position);
    if(index >= 0)
        return;
 
    int vertex = vertex_set(position, distance, parent, direction);
    int dist_ev = distance_ev(position, dest_position);
    int heap_node = heap_node_set(dist_ev + distance, vertices_len); //vertices_len == index of new vertex 
    vertices[vertices_len] = vertex;
    vertices_len = vertices_len + 1;
    heap_add(heap_node);
}
 
// Востанавливаем путь по вершинам графа
path_restore(int vertex)
{
    int parent = vertex_get_parent(vertex);
    while(parent != FROM_PARENT)
    {
        int dir = vertex_get_dir(vertex);
        path[path_len] = dir;
        path_len = path_len + 1;
        vertex = vertices[parent];
        parent = vertex_get_parent(vertex);
    }
}
Для проверки правильности работы этой реализации я написал функцию "разведка", которая обходит и запоминает всё поле. (Хотя для данной задачи лучше было использовать волновой алгоритм).

Несложно также написать функцию, которая будет будет составлять маршрут через все грядки на базу и проходить по этому пути, сажая клумбы (при последнем проходе через грядку).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2017, 14:53
Помогаю со студенческими работами здесь

робот
Робот может перемещаться в четырех направлениях (&quot;С&quot; -- север, &quot;З&quot; -- запад, &quot;Ю&quot; -- юг, &quot;В&quot; -- восток) и принимать три цифровые...

vb-робот
Доброго времени суток, коллеги. Можно ли программно заполнять текстовые поля, выставлять флаги, нажимать на кнопку, и пр. в браузере? ...

Робот
Напишите для исполнителя «Робот» оптимальный алгоритм (критерий оптимальности – минимальное число шагов исполнителя), предназначенный для...

Робот
Существуют ли такие клетки,что начав движение в ней,исполнитель разрушится при выполнении указ программы?найти все такие клетки.Как...

Робот
Недавно родители подарили Пете робота, которого можно программировать. Сначала робот находится в точке(0;0). Петя вводит роботу набор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru