Число перестановок в лексикографическом порядке - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы