Число перестановок в лексикографическом порядке - VB
Формулировка задачи:
Здравствуйте!
Как решать такие задачи, ниже? Очень прошу помощи.
Все перестановки 7 чисел (1;2;3;4;5;6;7) упорядочены в лексикографическом порядке. Найти перестановки с номерами: 3862, 2016, 7451, 1975 и 4589.
Догадываюсь, эти задачи при сноровке можно решать в уме за несколько минут. Пытаюсь уловить быстрый алгоритм. Посмотрел предварительно в Интернете, на душе тягостно. Все объяснения бестолковые, какое-то заскорузлое мышление и нет американского размаха мысли. Стыдно за наших математиков.Решение задачи: «Число перестановок в лексикографическом порядке»
textual
Листинг программы
VERSION 5.00 Begin VB.Form Form51 Caption = "Form51" ClientHeight = 3030 ClientLeft = 120 ClientTop = 450 ClientWidth = 4560 LinkTopic = "Form1" ScaleHeight = 3030 ScaleWidth = 4560 StartUpPosition = 3 'Windows Default End Attribute VB_Name = "Form51" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit Sub Start() Plist = Array(3862, 2016, 7451, 1975, 4589) Perms 7, Plist Debug.Print "OK" End Sub Sub swap(A() As Integer, n1 As Integer, n2 As Integer) tmp% = A(n1) A(n1) = A(n2) A(n2) = tmp% End Sub Function next_perm(Perm() As Integer) As Boolean n% = UBound(Perm, 1) For i% = n% - 1 To 1 Step -1 If Perm(i%) < Perm(i% + 1) Then imin% = i% + 1 vMin% = Perm(imin%) For k% = i% + 1 To n% If (Perm(k%) < vMin%) And (Perm(k%) > Perm(i%)) Then vMin% = Perm(k%) imin% = k% End If Next k% swap Perm, i%, imin% l% = i% + 1 r% = n% Do If r% - l% < 1 Then Exit Do swap Perm, l%, r% l% = l% + 1 r% = r% - 1 Loop next_perm = True Exit Function End If Next i% next_perm = False End Function Sub Perms(n As Integer, Plist As Variant) Dim X() As Integer Dim flgNext As Boolean ReDim X(1 To n) As Integer For i% = 1 To n X(i%) = i% Next i% num_perm& = 1 Do For ii% = 0 To UBound(Plist, 1) If num_perm& = CLng(Plist(ii%)) Then Debug.Print num_perm&; " -> "; For i% = 1 To n Debug.Print X(i%); " "; Next i% Debug.Print Exit For End If Next ii% flgNext = next_perm(X) If Not flgNext Then Exit Do num_perm& = num_perm& + 1 Loop End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д