Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 20.05.2012
Сообщений: 3

Определить, можно ли попасть по дорогам из l-того пункта в m-ый

20.05.2012, 19:01. Показов 2512. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется n населенных пунктов, пронумерованных от 1 до n (n=10).
Некоторые пары пунктов соединены дорогами. Определить, можно ли попасть по
этим дорогам из l-того пункта в m-ый.

Добавлено через 5 минут
Приветик всем) очень нужна помощь в решении этой задачи... очень буду благодарна за любую информацию)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2012, 19:01
Ответы с готовыми решениями:

Определить, можно ли попасть по этим дорогам из l-того пункта в m-ый
1. Имеется n населенных пунктов, пронумерованных от 1 до n (n=10). Некоторые пары пунктов соединены дорогами. Определить, можно ли...

Определить, можно ли попасть по дорогам из 1-го пункта в n-ый
помогите. вообще не знаю как сделать 3. Имеется n населенных пунктов, пронумерованных от 1 до n (n=10). Некоторые пары пунктов соединены...

Определить, можно ли попасть по дорогам из 1-го пункта в n-ный.
Помогите составить программы. 3.1. Описать рекурсивную функцию pow(x,n) от вещественного x(x¹0) и целого n, которая вычисляет...

10
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
20.05.2012, 20:20
В этой теме:
https://www.cyberforum.ru/pascal/thread525881.html
условие было более полное: дан способ описания дорог. Но ответа все равно нет
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
21.05.2012, 06:03
Лучший ответ Сообщение было отмечено как решение

Решение

Хм, были и сложнее задачки той же оперы (все практически на схожем алгоритме):

Перемещение фишки в поиске другой фишки
Обход с возвратом, указать стартовую ячейку
Как решать сквэрворды
Найти путь от перекрестка А до перекрестка В

Ничего такого уникального с чем бы не справился полный перебор.

Вот и с рекурсией:
Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
Option Explicit
 
Sub Main()
Dim n As Byte, Sha As Shape, Routes(), p1%, p2%, Steps%, Punkt(10) As Range, R_save()
ReDim Preserve R_save(9) 'макс. кол-во движений
 
[A1:K10].Clear
For Each Sha In ActiveSheet.Shapes 'удалить все дороги
   Sha.Delete
Next
Columns("A:M").ColumnWidth = 2
Coordinates Punkt() 'получаем координаты пунктов
 
'Заранее заданные дороги для теста
'==== закомментировать этот блок ===
[L1:L9] = Application.Transpose(Array(1, 2, 5, 7, 10, 3, 10, 1, 8))
[M1:M9] = Application.Transpose(Array(2, 6, 8, 9, 7, 8, 9, 8, 10))
'=================================
 
For n = 1 To 10 'отображаем пункты
  Punkt(n) = n
  Punkt(n).Font.Bold = True
Next
 
Routes = Range("L1", [M1].End(xlDown)) 'получаем дороги с листа
For n = 1 To UBound(Routes) 'рисуем дороги
  Draw_Route Punkt(Routes(n, 1)), Punkt(Routes(n, 2))
Next
 
p1 = CInt(InputBox("Введите № пункта А", , 10))
p2 = CInt(InputBox("Введите № пункта Б", , 6))
If p1 = p2 Then MsgBox "Уже приехали!": Exit Sub
 
R_save(0) = p1 'Steps=0
Find_Way p1, p2, Routes(), R_save(), Steps
 
If Steps = 0 Then MsgBox "Дорога не найдена!": Exit Sub
ReDim Preserve R_save(Steps)
For n = 0 To Steps
  Punkt(R_save(n)).Interior.Color = vbYellow
Next
MsgBox Join(R_save, " -> "), , "Будем ехать так ..."
 
End Sub
 
Private Sub Find_Way(ByRef p1%, ByVal p2%, Routes(), R_save(), Steps%)
Dim n As Byte, R_new%, V
 
For n = 1 To UBound(Routes)
  If p1 = p2 Or R_save(Steps) = p2 Then Exit For 'выходим из рекурсии
  R_new = 0
  If Routes(n, 1) = p1 Then 'ищем любую связку пути в массиве
    R_new = Routes(n, 2) 'нашли - отправляемся туда
    ElseIf Routes(n, 2) = p1 Then 'проверка зеркально
      R_new = Routes(n, 1)
  End If
  
  If R_new <> 0 Then 'нашли путь
    For Each V In R_save 'защита от зацикливания
      If R_new = V Then 'а здесь мы уже были
        R_new = 0: Routes(n, 1) = 0: Routes(n, 2) = 0: Exit For 'стираем дорогу
      End If
    Next
  End If
  
  If R_new <> 0 Then 'едем в другую деревню
    Steps = Steps + 1
    R_save(Steps) = R_new 'записываем трекинг на GPS
    Find_Way R_new, p2, Routes(), R_save(), Steps 'рекурсия (ищем как бы проехать от новой деревни)
  End If
Next
 
If p1 <> p2 And R_save(Steps) <> p2 Then
  If Steps <> 0 Then 'если не вернулись к разбитому корыту
     R_save(Steps) = 0 'стираем эпизод
     Steps = Steps - 1 'и едем обратно в предыдущий пункт
  End If
End If
 
End Sub
 
Private Sub Coordinates(Punkt() As Range)  'пингуем пункты
Set Punkt(1) = [E3]: Set Punkt(2) = [G3]
Set Punkt(3) = [C4]: Set Punkt(4) = [I4]
Set Punkt(5) = [B6]: Set Punkt(6) = [J6]
Set Punkt(7) = [C8]: Set Punkt(8) = [I8]
Set Punkt(9) = [E9]: Set Punkt(10) = [G9]
End Sub
 
Private Sub Draw_Route(ByVal RouteA As Range, ByVal RouteB As Range) 'уроки рисования
Dim Cx!, Cy!
Cx = [B2].Left / 2: Cy = [B2].Top / 2 'средина ячейки
ActiveSheet.Shapes.AddLine(RouteA.Left + Cx, RouteA.Top + Cy, RouteB.Left + Cx, RouteB.Top + Cy).Select
End Sub
Алгоритм писал по-новой. Идеи старые.
Рисовать и делать рекурсию учился первый раз.

Дороги можно самому строить на листе эксель, закомментировав указанные в коде строки.
3
0 / 0 / 0
Регистрация: 20.05.2012
Сообщений: 3
21.05.2012, 10:13  [ТС]
большое спасибо)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 14
21.05.2012, 18:22
Мне кажется, что эта задача сводится к обычному обходу графа:

Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Private Minc(1 To 10, 1 To 10) As Integer   ' Матрица смежности
Private Chk(1 To 10)              As Integer   ' массив для отметки
Private flg                            As Boolean  ' Флаг "путь найден"
 
Sub Init()  '::: Инициализация 
 
Dim i as integer
Dim j as integer
 
    For i=1 to 10
         Chk[i]=0
         For j=1 to 10
              Minc(i,j)=0
         Next j
    Next i
 
    Minc(1, 5) = 1
    Minc(5, 1) = 1
 
    Minc(2, 5) = 1
    Minc(5, 2) = 1
 
    Minc(3, 5) = 1
    Minc(5, 3) = 1
 
    Minc(6, 5) = 1
    Minc(5, 6) = 1
 
    Minc(6, 7) = 1
    Minc(7, 6) = 1
 
    Minc(4, 5) = 1
    Minc(5, 4) = 1
 
    Minc(4, 8) = 1    '!!!!
    Minc(8, 4) = 1    '!!!!
 
    Minc(9, 8) = 1
    Minc(8, 9) = 1
 
    Minc(8, 10) = 1
    Minc(10, 8) = 1
 
    flg = False
 
End Sub
 
Sub DFS(n As Integer, m As Integer)  '::: Обход в глубину с "отлавливанием" вершины m
 
Dim i As Integer
 
    If flg Then Exit Sub   '::: Если вершина уже встретилась...
 
    Chk(n) = 1
    
    For i = 1 To 10
    
        If (Minc(i, n) <> 0) And (Chk(i) = 0) Then
           
           If i = m Then
              flg = True
              Exit Sub
           End If
           
           DFS i, m
           
        End If
        
    Next i
 
End Sub
 
Sub Start()  '::: Стартовая процедура
 
    Init
 
    DFS 1, 10
 
    If flg Then
       Debug.Print "Путь существует"
    Else
       Debug.Print "Путь не существует"
    End If
 
End Sub
Если забить в процедуре инициализации строки, помеченные "!!!", то граф станет несвязным и
путь из 1-й в 10-ю не будет найден...
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.05.2012, 00:19
Собственно почти тот же алгоритм, только у Вас:

1) исходные данные заданы более удобно для вычислений (маршруты в обе стороны), у меня только в одну - нужно проверять зеркально.
2) путь не записывается на каждом шагу
Visual Basic
1
R_save(Steps) = № пункта
, а просто идет сквозная отметка о пройденных пунктах
Visual Basic
1
Chk(n) = 1
3) У меня сразу выходит из рекурсии, как только находит пункт Б, а у Вас продолжает гонять и даже заходит в новые итерации. Надо бы условие накинуть.

А в общем, все красиво и лаконично.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 14
22.05.2012, 09:28
Путь легко добавить вот так:

Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
Private Minc(1 To 10, 1 To 10) As Integer
Private Chk(1 To 10)           As Integer
Private flg                    As Boolean
Private Path                   As String   '::: Строка пути
 
Sub Init()
 
Dim i As Integer
Dim j As Integer
 
    For i = 1 To 10
    
        Chk(i) = 0
        
        For j = 1 To 10
            Minc(i, j) = 0
        Next j
        
    Next i
 
    Minc(1, 5) = 1
    Minc(5, 1) = 1
 
    Minc(2, 5) = 1
    Minc(5, 2) = 1
 
    Minc(3, 5) = 1
    Minc(5, 3) = 1
 
    Minc(6, 5) = 1
    Minc(5, 6) = 1
 
    Minc(6, 7) = 1
    Minc(7, 6) = 1
 
    Minc(4, 5) = 1
    Minc(5, 4) = 1
 
    'Minc(4, 8) = 1
    'Minc(8, 4) = 1
 
    Minc(9, 8) = 1
    Minc(8, 9) = 1
 
    Minc(8, 10) = 1
    Minc(10, 8) = 1
 
    flg = False
 
    Path = ""
 
End Sub
 
Sub DFS(n As Integer, m As Integer)
 
Dim i As Integer
 
    If flg Then
       Exit Sub
    End If
 
    Chk(n) = 1
    
    Path = Path & ";" & CStr(n)
    
    For i = 1 To 10
    
        If (Minc(i, n) <> 0) And (Chk(i) = 0) Then
           
           If i = m Then
              flg = True
              Debug.Print Path & ";" & CStr(m) '::: Печать пути
              Exit Sub
           End If
           
           DFS i, m
           
           k% = InStrRev(Path, ";")
           
           Path = Left$(Path, (k% - 1))
                      
        End If
        
    Next i
 
End Sub
 
Sub Start()
 
    Init
 
    DFS 7, 10
 
    If flg Then
       Debug.Print "Путь найден"
    Else
       Debug.Print "Путь не существует"
    End If
 
End Sub
1
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
09.02.2016, 16:15
Цитата Сообщение от Catstail Посмотреть сообщение
Мне кажется, что эта задача сводится к обычному обходу графа:
Не подскажете как аналогичную задачу решить на паскале?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 14
09.02.2016, 19:16
Цитата Сообщение от jestero Посмотреть сообщение
Не подскажете как аналогичную задачу решить на паскале?
- прямым переводом на Паскаль
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
01.03.2016, 12:29
Цитата Сообщение от Dragokas Посмотреть сообщение
Дороги можно самому строить на листе эксель, закомментировав указанные в коде строки.
Это как?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
01.03.2016, 15:00
Как что, закомментировать код, или ввести свои значения.
Код комментируется в 16 и 17-й строках символом '
Значения вводятся с клавиатуры, перезаписывая в столбцах L и M те, что там уже находятся
(при первом запуске программы это будет видно). По умолчанию, код обрабатывает 10 пересечений пунктов.
Миниатюры
Определить, можно ли попасть по дорогам из l-того пункта в m-ый  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2016, 15:00
Помогаю со студенческими работами здесь

Определить, можно ли попасть по дорогам из первого пункта в n-й
На карте местности имеется N населенных пунктов, пронумерованных от 1 до N (N&lt;= 10). Некоторые из пунктов соединены между собой дорогами....

Определить, можно ли попасть по этим дорогам из первого пункта в n-й
Всем привет, помогите пожалуйста с программой. Или хотя бы подскажите, что с чем нужно сравнивать. Рекурсия Задача: На карте...

Используя рекурсию, определить, можно ли по дорогам попасть из 1-го пункта в N-ый
Имеется 10 населенных пунктов. Дана последовательность пар чисел пар чисел I и J (I&lt;J), указывающих, что I –ый J-ый пункты соединены...

Определить, можно ли попасть по дорогам из первого населенного пункта в последний
Поделитесь мыслями, как можно сделать это задание. Вот и само условие задания. На местности имеется N населенных пунктов, пронумерованных...

Используя рекурсию, определить, можно ли по этим дорогам попасть из 1-го пункта в N-ый
Помогите пожалуйста написать код. Вот задание: Имеется 10 населенных пунктов. Дана последовательность пар чисел пар чисел I и J...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru