Домино - QBasic
Формулировка задачи:
Вот реально наскучили однотипные задачи от
echs
, замешанные на рекурсии особенно. Есть же и другие приёмы программирования. Вот известен ли вам метод бэктрекинг? Задача такая: Из стандартного набора домино ( кто не знает, 28 штук = 0-0, 0-1, 0-2 ... 6-6) в случайном порядке берём N штук. Задача компьютера выстроить максимально возможную цепочку, состыковывая их по правилам домино частями с равным количеством точек.Пример
N= 6 1-2:1-3:2-6:3-6:5-6:4-4Решение
Цепочка из 5 элементов 5-6:6-2:2-1:1-3:3-6 Кто сможет решить любым способом, не обязательно при помощи бэктрекинга, главное правильно и эффективно?Решение задачи: «Домино»
textual
Листинг программы
- Dim s, b() As Boolean, n As Long, m As String, k As Long, l As Long
- Sub main()
- m = ""
- k = 0
- l = 0
- s = Array("1-2", "1-3", "2-6", "3-6", "5-6", "4-4")
- n = UBound(s)
- ReDim b(n) As Boolean
- domino "", ""
- Debug.Print Mid$(m, 2)
- 'Debug.Print "Всего вариантов: " & l, "из них с максимальной последовательностью: " & k
- End Sub
- Sub domino(txt As String, ms As String)
- Dim i As Long, flag As Boolean
- For i = 0 To n
- If (b(i) = False And (Right(txt, 1) = Left(s(i), 1) Or Right(txt, 1) = Right(s(i), 1))) Or txt = "" Then
- flag = True
- b(i) = True
- If Right(txt, 1) = Right(s(i), 1) Then domino StrReverse(s(i)), ms & ":" & StrReverse(s(i)) Else domino CStr(s(i)), ms & ":" & s(i)
- b(i) = False
- End If
- Next i
- If Not flag Then
- If Len(m) < Len(ms) Then m = ms: k = 0
- If Len(ms) = Len(m) Then k = k + 1
- l = l + 1
- End If
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д