![]() |
|
OFF: Поиск паука-матки в лабиринте (Python) 🠗 (Волшебник 16.05.2025 09:27) | ☑ | ||
---|---|---|---|---|
0
Волшебник
15.05.25
✎
16:21
|
Учёным колонистов на другой планете удалось разработать дрона в виде паука, который не отличим от настоящего. У дрона есть МУТАГЕН, которым можно воздействовать на паука-матку, чтобы следующее поколение пауков стало дружелюбным к людям. Для этого нужно найти паука-матку в подземном лабиринте MxN. Для простоты предположим, что лабиринт двумерный прямоугольный с ортогональной тесселяцией размерами от 5 до 15 по каждому измерению. Гамма-сканирование показало, где именно находится матка (координаты цели известны), но структура лабиринта неизвестна. Дрон стартует из точки [0,0] - левый верхний угол. Зарядки дрона хватает на ограниченное количество шагов (задаётся).
Напишите функцию go() в программе ниже, чтобы дрон мог найти цель. Алгоритм может быть не самым оптимальным. Шаблон программы: https://disk.yandex.ru/d/pZUqV-rDenuSiQ Для запуска можно использовать https://www.online-python.com/ Пример лабиринта ниже: # — камень/стена O — цель . — маршрут дрона
|
|||
1
СвинТуз
15.05.25
✎
16:32
|
||||
2
СвинТуз
15.05.25
✎
16:33
|
лабиринт односвязный?
|
|||
3
Волшебник
15.05.25
✎
16:44
|
(2) многосвязный
|
|||
4
СвинТуз
15.05.25
✎
16:47
|
какое-то решение на Сboolean[][] maze = new boolean[width][height]; // The maze boolean[][] wasHere = new boolean[width][height]; boolean[][] correctPath = new boolean[width][height]; // The solution to the maze int startX, startY; // Starting X and Y values of maze int endX, endY; // Ending X and Y values of maze public void solveMaze() { maze = generateMaze(); // Create Maze (false = path, true = wall) // Below assignment to false is redundant as Java assigns array elements to false by default, but it is included because other languages may not behave the same. for (int row = 0; row < maze.length; row++) // Sets boolean Arrays to default values for (int col = 0; col < maze[row].length; col++){ wasHere[row][col] = false; correctPath[row][col] = false; } boolean b = recursiveSolve(startX, startY); // Will leave you with a boolean array (correctPath) // with the path indicated by true values. // If b is false, there is no solution to the maze } public boolean recursiveSolve(int x, int y) { if (x == endX && y == endY) return true; // If you reached the end if (maze[x][y] || wasHere[x][y]) return false; // If you are on a wall or already were here wasHere[x][y] = true; if (x != 0) // Checks if not on left edge if (recursiveSolve(x-1, y)) { // Recalls method one to the left correctPath[x][y] = true; // Sets that path value to true; return true; } if (x != width - 1) // Checks if not on right edge if (recursiveSolve(x+1, y)) { // Recalls method one to the right correctPath[x][y] = true; return true; } if (y != 0) // Checks if not on top edge if (recursiveSolve(x, y-1)) { // Recalls method one up correctPath[x][y] = true; return true; } if (y != height - 1) // Checks if not on bottom edge if (recursiveSolve(x, y+1)) { // Recalls method one down correctPath[x][y] = true; return true; } return false; } |
|||
5
Волшебник
15.05.25
✎
16:47
|
(4) Внимательнее прочитайте условие, там язык Python
|
|||
6
СвинТуз
15.05.25
✎
16:51
|
(5)
Это Ява ну уж ... мы не на форуме поклонников Питона. С Явы я пререведу если надо. Но писать ну чужом языке. Это кто-то другой ))) |
|||
7
Волшебник
15.05.25
✎
16:53
|
(6) Переведите с Java на Python
|
|||
8
СвинТуз
15.05.25
✎
16:56
|
(7)
))) я могу но лень. |
|||
9
СвинТуз
15.05.25
✎
22:10
|
слишком много времени ни на что
|
|||
10
СвинТуз
15.05.25
✎
17:00
|
Наслаждайтесь.
https://uproger.com/reshenie-labirinta-s-pomoshhyu-obucheniya-s-podkrepleniem/ Настоящий 1С-ник должен быть туп, ленив и жаден если забыли. С этим я могу работать. |
|||
11
СвинТуз
15.05.25
✎
17:00
|
только лень.
|
|||
12
sikuda
15.05.25
✎
17:03
|
(8) Найти код в интеренете и не найти конвертора
https://products.codeporting.ai/ru/convert/java-to-python/ |
|||
13
СвинТуз
15.05.25
✎
17:04
|
(12)
я примерно о том же. |
|||
14
СвинТуз
15.05.25
✎
17:05
|
(12)
Я его в принципе читаю, как код на большинстве языков. Но переводить = без меня. ну или найти конвертер. это все легко. |
|||
15
Волшебник
15.05.25
✎
17:06
|
(10) Слишком сложно. Здесь достаточно алгоритма случайного движения мыши (Random Mouse Algorithm) даже без памяти.
Для ускорения сходимости можно добавить память пройденных клеток и сначала выбирать среди новых. |
|||
16
СвинТуз
15.05.25
✎
17:08
|
(15)
Зачем мне тупому, ленивому и жадному? Я не пишу на питоне. Не пишу игры. Если припрет я раскопаю. |
|||
17
sikuda
15.05.25
✎
17:16
|
(15) Это не по нашему. Мы любим алгоритмы:
Каждый ход это увеличение массива точек куда может прийти робот. От каждой точки массива берем (влево, вверх, вправо, вниз) - проверяем на стенку и на уникальность в массиве. Как только в этом массиве есть конечная точка заканчиваем |
|||
18
СвинТуз
15.05.25
✎
17:11
|
Интегралы по поверхности сложнее брать,
хотя если знать как то решить, например, изгибные колебания круглой пьезокерамической пластины на трех опорах под воздействием тока довольно просто. |
|||
19
СвинТуз
15.05.25
✎
17:12
|
(17)
Тут все гуру решат. Вопрос времени. Даже на Питоне. |
|||
20
СвинТуз
15.05.25
✎
17:16
|
Все пугают сопроматом. Вообще легко было.
Сложно было математический анализ на первой сессии. ладно. Хорошего вечера всем. |
|||
21
СвинТуз
15.05.25
✎
17:17
|
Алгоритм прост.
Найти шаблон на питоне и подогнать. |
|||
22
СвинТуз
15.05.25
✎
17:19
|
(0)
Лет через 12.5 приходите с такими вопросами. Наступит пенсия. Развлекусь с удовольствием. Пока есть работа )))) |
|||
23
СвинТуз
15.05.25
✎
17:40
|
Строго говоря это не лабиринт. Это плоскость с завалами.
Видимо "Алгоритм мыши" нужен. + стараться сокращать расстояние. Когда-то давно была игра. "Time zero" был момент когда монстры не могли выбрать путь к игроку. Путь в таких случаях преграждал завал камней. Мышь не могла выбрать в какую сторону путь короче. Циклилась. Число камней было больше чем заданное как ограничение.(Уходила далеко от игрока.) И на следующем ходу она начинала сокращать расстояние идя обратно. |
|||
24
Garykom
гуру
15.05.25
✎
17:53
|
банальный волновой алгоритм не?
|
|||
25
Волшебник
15.05.25
✎
18:38
|
(24) Это тоже избыточно. Здесь надо просто найти цель, а не найти кратчайший путь к цели.
|
|||
26
Волшебник
15.05.25
✎
22:07
|
Чё такие кислые? DeepSeek справился за 3 итерации.
Функция go() укладывается в 30 строчек. |
|||
27
Волшебник
15.05.25
✎
22:31
|
Qwen справился ещё быстрее, но он был уже в контексте и в промте было сразу разрешено задействовать память мыши.
|
|||
28
sikuda
16.05.25
✎
08:33
|
(26) Основная ошибка людей полагать что Artificial intelligence сам думает и делает. Он просто перебирает варианты на которых научился и сложно их компонует.
Главная задача не написать алгоритм, главная чтобы как можно больше людей понимало как это работает. И далее хорошая лекция про коллекции Python, сложности алгоритмов вставки и проверки совпадения... |
|||
29
Волшебник
16.05.25
✎
09:45
|
Ладно, держите решение.
Программа целиком:import random def go(maze, m, n, target, start, max_steps): """Ищет цель в лабиринте, возвращает список ячеек Path или None""" visited = set() path = [start] visited.add(start) directions = [(1, 0), (-1, 0), # X (0, 1), (0, -1)] # Y current = start while current != target and len(path) <= max_steps: x, y = current neighbors = [] unvisited_neighbors = [] for (dx, dy) in directions: nx, ny = x + dx, y + dy if is_free(nx, ny, maze, m, n): neighbors.append((nx, ny)) if (nx, ny) not in visited: unvisited_neighbors.append((nx, ny)) if not neighbors: # тупик return None elif unvisited_neighbors: # Если есть непосещённые, выбираем случайное из них next_cell = random.choice(unvisited_neighbors) else: # Иначе выбираем из всех доступных next_cell = random.choice(neighbors) current = next_cell visited.add(current) path.append(current) return path if (current == target) else None def generate_maze(m, n, start, target, wall_prob): """Генерирует лабиринт со случайными стенами, исключая стартовую и целевую ячейки.""" maze = [[True for _ in range(n)] for _ in range(m)] for x in range(m): for y in range(n): if (x, y) != start and (x, y) != target: if random.random() < wall_prob: maze[x][y] = False return maze def is_free(x, y, maze, m, n): """Проверяет, является ли ячейка свободной (True)""" return 0 <= x < m and 0 <= y < n and maze[x][y] def display_maze(maze, m, n, target, title="Maze", path=[]): """Визуализирует карту с маршрутом.""" print(f"\n--- {title} ---") for x in range(m): sign = "" for y in range(n): coord = (x, y) if coord == target: sign += " O" elif maze[x][y] == False: sign += " #" elif coord in path: sign += " ." else: sign += " " print(sign) # тело программы if __name__ == "__main__": M, N = random.randint(5,15), random.randint(5,15) # Размеры лабиринта start = (0, 0) # Начальная позиция max_steps = 1000 # Максимальная дальность пути target = (random.randint(0, M-1), random.randint(0, N-1)) # Генерация лабиринта. True - ячейка пустая, False - камень/стена maze = generate_maze(M, N, start, target, wall_prob=0.2) # Отображение оригинального лабиринта display_maze(maze, M, N, target, "Maze") # запуск алгоритма поиска цели path = go(maze, M, N, target, start, max_steps) if path: # Цель найдена. Отображение карты с маршрутом display_maze(maze, M, N, target, "Path", path) print(f"\nЦель найдена за {len(path) - 1} шагов.") else: print(f"\nНе удалось найти цель.") |
|||
30
Волшебник
16.05.25
✎
09:27
|
Продолжение: Выведение расы дружелюбных разумных пауков
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |