powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Задача
20 сообщений из 20, страница 1 из 1
Задача
    #33048204
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу оговорюсь, если отвлекаю от важных дел не отвечайте.
Позвонил племянник, помогает подруге решать задачу.

Есть массив(лабиринт) скажем 15х15. Заполнен 0 и 1. Надо пройти сверху вниз
по нолям к выходу. Все сделал, нарисовал лабиринт, заполнил 0 и 1, но вот пройти не получается. Пробуем все время идти если 0 то вперед, если 1 то вправо по идее должен пройти, но не тут то было.

Если есть алгоритм прохода сбросте пожалуйста, может решал кто уже?
...
Рейтинг: 0 / 0
Задача
    #33048633
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен, что правильно понял, лабиринт выглядит так?
...
Рейтинг: 0 / 0
Задача
    #33048637
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[Картинка по пути потерялась]
...
Рейтинг: 0 / 0
Задача
    #33048817
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да может именно так (формируется случайно), но как решить?
...
Рейтинг: 0 / 0
Задача
    #33049081
Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I tak ponyla,chto idti nado sverhy vniz i ne obyzatelno esli 0 to vpered,esli 1 to vpravo(eto vi vibrali takoy algoritm)poprobyute tak:
Pole(15,15) array
y, x

EndGame Boolean peremennaya
ishy tochky vhoda sverhy v labirint
y=1
for x=1 to 15
if Pole(y,x)=0 then
Pole(y,x) = 1
EndGame = False

While EndGame = False
--pervim proveryu dorogy vniz(potomy chto zel douti do nizy,chem bistree)
if Pole(y+1,x) = 0 Then
Pole(y+1,x) = 1
y = y+1
goto NextCheck
End if
--proveryau pravo
if Pole(y,x+1) = 0 Then
Pole(y,x+1) = 1
x = x+1
goto NextCheck
End if

--proveryau Levee
if Pole(y,x-1) = 0 Then
Pole(y,x-1) = 1
x = x-1
goto NextCheck
End if

--proveryu vverh
if Pole(y-1,x) = 0 Then
Pole(y-1,x) = 1
y = y-1
goto NextCheck
End if

NextCheck:
--proveryu mojet bit yje konez labirinta
if Pole(y+1,x) = 1 and Pole(y,x-1) = 1 and Pole(y,x+1) = 1 and Pole(y-1,x) = 1 then
EndGame = true
Exit sub
end if

Wend
end if

next x
...
Рейтинг: 0 / 0
Задача
    #33049245
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо попробуем, но почему

EndGame Boolean peremennaya
ishy tochky vhoda sverhy v labirint
y=1
for x=1 to 15
if Pole(y,x)=0 then
Pole(y,x) = 1 ?
...
Рейтинг: 0 / 0
Задача
    #33049253
Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Potomy-chto vezde gde mi nashli 0 zamenyem na 1,chto- bi ne popast v beskonechniy zikl,mojno i bez etogo na pervom shage(vsegda perestrahovivaus)
dlya privedennogo primera na kartinke etot algoritm rabotaet,kak mne kajetsya dlya ostalnix variantov toje
...
Рейтинг: 0 / 0
Задача
    #33049258
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если назад возвращаться прийдется?
...
Рейтинг: 0 / 0
Задача
    #33049271
Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey13: poprobyute prouyi po-etomy labirinty s pomoshu eto-algoritma i posmotrite kogda vam pridetsya vozvrashatsya nazad?
...
Рейтинг: 0 / 0
Задача
    #33049280
Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey13:Vi pravi mojet ponadobitsya idti nazad,k sojaleniu I yje ybegau domoy,esli vam tak srochno,to v etot algoritm mojno dobavit promejytochniy massiv tipa PreviousStep(x,y) gde sohranyt odin shag nazad ili poly kotorie proshli stavit 2 vmesto 1
...
Рейтинг: 0 / 0
Задача
    #33049461
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest123 большое спасибо за поддержку, я вообще думал что кто то уже решал такую задачу, и есть готовое решение. Мой племянник уже вышел из порложения, на сколько я понял по телефону, он создал несколько подпрограмм Vpered, Nazad, Vpravo, Vlevo, и пользовался этими подпрограммами в момент прохождения лабиринта. Для того и задачи что бы молодеж училась. Хотя любой голову бы поломал над этим.
...
Рейтинг: 0 / 0
Задача
    #33049674
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решал давно на паскале похожий алгоритм, исходников ессно не сохранилось, но идею помню.

В основе всего лежит рекурсия. Не самый быстрый способ, но для поля 15х15 пойдет. Процедура будет выглядеть так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub FindPath(x, y, FromWhere)
End Sub

Enum Direction
    West =  0 
    North =  1 
    East =  2 
    South =  3 
End Enum
Допустим вход в лабиринт находится в позиции с10 и мы дошли до позиции с9. Из текущей позиции есть три направления - запад, север, восток. Далее перебираем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
If FromWhere<>South then
    FindPath x- 1 , y, East
    FindPath x, y- 1 , South
    FindPath x+ 1 , y, West
End If
If FromWhere<>East then
    FindPath x- 1 , y, East
    FindPath x, y+ 1 , North
    FindPath x, y- 1 , South
End If
... и т.д. То есть проверяем все направления, кроме того, откуда пришли. Если на текушей позиции единица, то выходим из процедуры. Если координаты совпадают с координатами выхода - End.
Код: plaintext
1.
2.
3.
4.
5.
6.
Sub FindPath(x, y, FromWhere)
    If MazeMatrix(x, y)= 1  Then Exit Sub
    If x= 8  and y= 1  Then 
        MsgBox "Дошли!"
        End
    End If

А насчет того, чтобы "пройти назад"... хоть вперед, хоть назад, хоть вбок. Конечный результат задается координатами, а этот алгоритм блуждает по лабиринту вслепую, ему пох, куда идти.
...
Рейтинг: 0 / 0
Задача
    #33049698
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот весь листинг:
Код: plaintext
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.
Enum Direction
    West =  0 
    North =  1 
    East =  2 
    South =  3 
End Enum

Dim MazeMatrix( 1  To  15 ,  1  To  15 )

Sub FindPath(x, y, FromWhere As Direction)
    If MazeMatrix(x, y) =  1  Then Exit Sub
    If x =  8  And y =  1  Then
        MsgBox "Дошли!"
        End
    End If
    If FromWhere <> South Then
        FindPath x -  1 , y, East
        FindPath x, y -  1 , South
        FindPath x +  1 , y, West
    End If
    If FromWhere <> East Then
        FindPath x -  1 , y, East
        FindPath x, y +  1 , North
        FindPath x, y -  1 , South
    End If
    If FromWhere <> North Then
        FindPath x -  1 , y, East
        FindPath x, y +  1 , North
        FindPath x +  1 , y, West
    End If
    If FromWhere <> West Then
        FindPath x +  1 , y, West
        FindPath x, y +  1 , North
        FindPath x, y -  1 , South
    End If
End Sub

...
Рейтинг: 0 / 0
Задача
    #33049716
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слегка затупил:
Код: plaintext
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.
Enum Direction
    West =  0 
    North =  1 
    East =  2 
    South =  3 
End Enum

Dim MazeMatrix( 1  To  15 ,  1  To  15 )

Sub FindPath(x, y, FromWhere As Direction)
    If MazeMatrix(x, y) =  1  Then Exit Sub
    If x =  8  And y =  1  Then
        MsgBox "Äîøëè!"
        End
    End If
    If FromWhere <> South Then
        FindPath x -  1 , y, East
        FindPath x, y -  1 , South
        FindPath x +  1 , y, West
    ElseIf FromWhere <> East Then
        FindPath x -  1 , y, East
        FindPath x, y +  1 , North
        FindPath x, y -  1 , South
    ElseIf FromWhere <> North Then
        FindPath x -  1 , y, East
        FindPath x, y +  1 , North
        FindPath x +  1 , y, West
    ElseIf FromWhere <> West Then
        FindPath x +  1 , y, West
        FindPath x, y +  1 , North
        FindPath x, y -  1 , South
    End If
End Sub

...
Рейтинг: 0 / 0
Задача
    #33051450
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое. Отошлю пускай посмотрит. Но у него тоже работает, только что вечером заходил смотрел. Правда код длинный. Только я не понял, у тебя будет бродить пока до конца не дойдет В СЛЕПУЮ, или я ошибаюсь?
...
Рейтинг: 0 / 0
Задача
    #33052209
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно. Преставь себе слепого в коридоре. Он сделал шаг, повел палкой налево - стена, вперед - стена, направо - проход есть. Сзади елозить не нужно, потому что оттуда пришел. Делает шаг направо. Опять елозит палкой. Однако, если зашел в тупик, ему не надо точно так же вслепую брести в обратную сторону. Благодаря рекурсии все повороты уже в памяти.
...
Рейтинг: 0 / 0
Задача
    #33052230
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один момент. Лучше заменить условия
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Celect Case FromWhere
    Case North
        FindPath x -  1 , y, East
        FindPath x, y -  1 , South
        FindPath x +  1 , y, West
    Case West
        FindPath x -  1 , y, East
        FindPath x, y +  1 , North
        FindPath x, y -  1 , South
    Case East
        FindPath x +  1 , y, West
        FindPath x, y +  1 , North
        FindPath x, y -  1 , South
    Case South
        FindPath x -  1 , y, East
        FindPath x, y +  1 , North
        FindPath x +  1 , y, West
End Select
...
Рейтинг: 0 / 0
Задача
    #33053518
Фотография Andrey13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда все правильно получается что и не слепой.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Задача
    #37261269
General1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey13, а это решение ратоает черз Excel? мне надо 0 и 1 самому вводить на странице эксель а потом проверять, можно ли пройти от ячейки А1 до противоположного конца...размер вводимой матрицы произвольный...не поможете?
...
Рейтинг: 0 / 0
Задача
    #37261459
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
General1992Andrey13, а это решение ратоает черз Excel?
грубо говоря, заменить обращение к массиву
Код: plaintext
MazeMatrix(x, y)
на обращение к ячейке
Код: plaintext
Cells(x, y)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Задача
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]