| 
    
            
         
         | 
    
  | 
        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 
 | 
         
        Продолжение: Выведение расы дружелюбных разумных пауков     
         | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |