走阶梯算法设计(源码)

原创 2006年06月21日 22:37:00

 要求: 某人上阶梯,阶梯共100道,可以一次跨1个阶梯,可以一次跨2个阶梯,可以一次跨3个阶梯,问上一次阶梯共有多少种走法?另请列出每种走法的步数排列(按先后顺序)!

'高精度正整数加减法,即大正整数加减法
'减法运算,已知第一数大于第二数
'主要用于本程序,为简化代码,不做转换和符号判断,如果想实现通用运算,请另外调整
Function dsys(n1, n2, f) As String
    Dim b1(), b2(), c, i, s
   
    '取大数长度分段分配数组大小
    c = IIf(Len(n1) > Len(n2), Int(Len(n1) / 12), Int(Len(n2) / 12)) + 1
    ReDim b1(c + 1), b2(c)
    s = 0
   
    'n1按12位分段取数存入数组
    For i = 1 To Len(n1) Step 12
        s = s + 1
        If Len(n1) > s * 12 Then
            b1(s) = Mid(n1, Len(n1) - s * 12 + 1, 12)
        Else
            b1(s) = Mid(n1, 1, Len(n1) - (s - 1) * 12)
        End If
    Next i
   
    'n2按12位分段取数存入数组
    s = 0
    For i = 1 To Len(n2) Step 12
        s = s + 1
        If Len(n2) > s * 12 Then
            b2(s) = Mid(n2, Len(n2) - s * 12 + 1, 12)
        Else
            b2(s) = Mid(n2, 1, Len(n2) - (s - 1) * 12)
        End If
    Next i
   
    '加法
    If f = 1 Then
        '按段相加,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) + Val(b2(i))
           
            '进位
            If Len(b1(i)) > 12 Then
                b1(i + 1) = Val(b1(i + 1)) + Val(Left(b1(i), Len(b1(i)) - 12))
                b1(i) = Right(b1(i), 12)
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    '减法
    Else
        '按段相減,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) - Val(b2(i))
           
            '借位
            If b1(i) < 0 Then
                b1(i + 1) = Val(b1(i + 1)) - 1
                b1(i) = Val(b1(i)) + 10 ^ 12
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    End If
    '去前0
    For i = 1 To Len(dsys)
        If Mid(dsys, i, 1) <> "0" Then
            dsys = Mid(dsys, i)
            Exit For
        End If
    Next i
End Function

'阶梯走法算法
Function dgzf(t As Integer, m As String) As String
Dim i As Integer
    '递归到1阶的走法
    If t = 1 Then
        dgzf = "1"
        Exit Function
    '递归到2阶的第2种走法
    ElseIf t = 2 And m = 2 Then
        dgzf = "2"
        Exit Function
    '递归到3阶的第4种走法
    ElseIf t = 3 And m = 4 Then
        dgzf = "3"
        Exit Function
    '假如走法数小等于上一阶走法总数
    ElseIf Not (dsbj(m, a(t - 1))) Then
        dgzf = "1" & dgzf(t - 1, m)
    '假如走法数小等于上两阶走法总数
    ElseIf dsbj(m, a(t - 1)) And Not (dsbj(m, dsys(a(t - 1), a(t - 2), 1))) Then
        dgzf = "2" & dgzf(t - 2, dsys(m, a(t - 1), 2))
    '假如走法数大于上两阶走法总数
    ElseIf dsbj(m, dsys(a(t - 1), a(t - 2), 1)) Then
        dgzf = "3" & dgzf(t - 3, dsys(dsys(m, a(t - 1), 2), a(t - 2), 2))
    End If
End Function

以下为程序源码,将以下内容复制粘贴到新建的文本文件中,保存后再将文件后缀名改名 .frm

VERSION 5.00
Begin VB.Form Form1
   Caption         =   "走阶梯算法设计"
   ClientHeight    =   4920
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   6360
   LinkTopic       =   "Form1"
   ScaleHeight     =   4920
   ScaleWidth      =   6360
   StartUpPosition =   3  '窗口缺省
   Begin VB.Frame Frame2
      Caption         =   "求解:"
      ForeColor       =   &H000000FF&
      Height          =   3735
      Left            =   120
      TabIndex        =   2
      Top             =   1080
      Width           =   6135
      Begin VB.CommandButton Command2
         Caption         =   "结果清空"
         Height          =   375
         Left            =   4560
         TabIndex        =   11
         Top             =   240
         Width           =   1215
      End
      Begin VB.TextBox Text3
         Height          =   270
         Left            =   1080
         TabIndex        =   10
         Top             =   1155
         Width           =   4935
      End
      Begin VB.CommandButton Command1
         Caption         =   "求解走法"
         Default         =   -1  'True
         Height          =   375
         Left            =   3000
         TabIndex        =   9
         Top             =   240
         Width           =   1215
      End
      Begin VB.TextBox Text1
         Height          =   2055
         Left            =   120
         MultiLine       =   -1  'True
         ScrollBars      =   2  'Vertical
         TabIndex        =   8
         Top             =   1560
         Width           =   5895
      End
      Begin VB.ComboBox Combo1
         Height          =   300
         Left            =   1680
         Style           =   2  'Dropdown List
         TabIndex        =   6
         Top             =   270
         Width           =   975
      End
      Begin VB.TextBox Text2
         Height          =   270
         Left            =   1080
         Locked          =   -1  'True
         TabIndex        =   5
         Top             =   720
         Width           =   4935
      End
      Begin VB.Label Label4
         AutoSize        =   -1  'True
         Caption         =   "某种走法:"
         Height          =   180
         Left            =   120
         TabIndex        =   7
         Top             =   1200
         Width           =   900
      End
      Begin VB.Label Label3
         AutoSize        =   -1  'True
         Caption         =   "走法总数:"
         Height          =   180
         Left            =   120
         TabIndex        =   4
         Top             =   765
         Width           =   900
      End
      Begin VB.Label Label1
         AutoSize        =   -1  'True
         Caption         =   "阶梯数(1-200):"
         Height          =   180
         Left            =   120
         TabIndex        =   3
         Top             =   330
         Width           =   1350
      End
   End
   Begin VB.Frame Frame1
      BackColor       =   &H80000016&
      Caption         =   "要求:"
      ForeColor       =   &H000000FF&
      Height          =   975
      Left            =   120
      TabIndex        =   0
      Top             =   0
      Width           =   6135
      Begin VB.Label Label2
         BackColor       =   &H80000016&
         BackStyle       =   0  'Transparent
         Caption         =   $"Form1.frx":0000
         ForeColor       =   &H00FF0000&
         Height          =   615
         Left            =   240
         TabIndex        =   1
         Top             =   240
         Width           =   5775
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
' 要求: 某人上阶梯,阶梯共100道,可以一次跨1个阶梯,可以一次跨2个阶梯,可以一次跨3个阶梯,问
'       上一次阶梯共有多少种走法?另请列出每种走法的步数排列(按先后顺序)!
Dim a() As String

Private Sub Command1_Click()
Dim str1 As String
    If dsbj(Text3.Text, a(Combo1.Text)) Or Text3.Text = "" Or Text3 Like "*[!0-9]*" Then
        MsgBox "输入数据过大或非数字", vbOKOnly + vbExclamation, "阶梯算法"
        Text3.SetFocus
        Exit Sub
    End If
    str1 = dgzf(Combo1.Text, Text3.Text)
    Text1 = vbNewLine & Combo1.Text & "级阶梯第【" & Text3 & "】种走法:" & vbNewLine & str1 & vbNewLine & Text1
End Sub

Private Sub Combo1_Click()
    Text2 = a(Combo1.Text)
    Text2.ToolTipText = Text2
End Sub

Private Sub Command2_Click()
    Text1 = ""
End Sub

Private Sub Text2_Change()
    If dsbj(Text3, Text2) Or Text3 = "" Then Text3 = Text2
End Sub

'输入数据合法性判断
Private Sub Text3_KeyPress(KeyAscii As Integer)
Dim str1 As String
   
    If KeyAscii = vbKeyRight Or KeyAscii = vbKeyLeft Or KeyAscii = vbKeyBack Then
    ElseIf KeyAscii < vbKey0 Or KeyAscii > vbKey9 Then
        KeyAscii = 0
    Else
        str1 = Text3
        str1 = Left(str1, Text3.SelStart) & Chr(KeyAscii) & Mid(str1, Text3.SelStart + Text3.SelLength + 1)
        If dsbj(str1, Text2) Or str1 Like "0*" Then KeyAscii = 0
    End If
End Sub

Private Sub Form_Load()
Dim i As Integer
    zfzs 200
    For i = 1 To 200
        Combo1.AddItem i
    Next i
    Combo1.Text = 100
   
End Sub

'阶梯走法算法
Function dgzf(t As Integer, m As String) As String
Dim i As Integer
    '递归到1阶的走法
    If t = 1 Then
        dgzf = "1"
        Exit Function
    '递归到2阶的第2种走法
    ElseIf t = 2 And m = 2 Then
        dgzf = "2"
        Exit Function
    '递归到3阶的第4种走法
    ElseIf t = 3 And m = 4 Then
        dgzf = "3"
        Exit Function
    '假如走法数小等于上一阶走法总数
    ElseIf Not (dsbj(m, a(t - 1))) Then
        dgzf = "1" & dgzf(t - 1, m)
    '假如走法数小等于上两阶走法总数
    ElseIf dsbj(m, a(t - 1)) And Not (dsbj(m, dsys(a(t - 1), a(t - 2), 1))) Then
        dgzf = "2" & dgzf(t - 2, dsys(m, a(t - 1), 2))
    '假如走法数大于上两阶走法总数
    ElseIf dsbj(m, dsys(a(t - 1), a(t - 2), 1)) Then
        dgzf = "3" & dgzf(t - 3, dsys(dsys(m, a(t - 1), 2), a(t - 2), 2))
    End If

End Function

'求某一阶数的走法总数,f(n)=f(n-1)+f(n-2)+f(n-3)
Function zfzs(n As Integer) As String
    ReDim a(n)
    Dim i As Integer
    If n > 0 Then a(1) = 1
    If n > 1 Then a(2) = 2
    If n > 2 Then a(3) = 4
   
    For i = 4 To n
        If Len(a(i - 1)) < 13 Then
            a(i) = Val(a(i - 1)) + Val(a(i - 2)) + Val(a(i - 3))
        Else
            a(i) = dsys(dsys(a(i - 1), a(i - 2), 1), a(i - 3), 1)
        End If
    Next i
    zfzs = a(n)
End Function

'高精度正整数加减法,即大正整数加减法
'减法运算,已知第一数大于第二数
'主要用于本程序,为简化代码,不做转换和符号判断,如果想实现通用运算,请另外调整
Function dsys(n1, n2, f) As String
    Dim b1(), b2(), c, i, s
   
    '取大数长度分段分配数组大小
    c = IIf(Len(n1) > Len(n2), Int(Len(n1) / 12), Int(Len(n2) / 12)) + 1
    ReDim b1(c + 1), b2(c)
    s = 0
   
    'n1按12位分段取数存入数组
    For i = 1 To Len(n1) Step 12
        s = s + 1
        If Len(n1) > s * 12 Then
            b1(s) = Mid(n1, Len(n1) - s * 12 + 1, 12)
        Else
            b1(s) = Mid(n1, 1, Len(n1) - (s - 1) * 12)
        End If
    Next i
   
    'n2按12位分段取数存入数组
    s = 0
    For i = 1 To Len(n2) Step 12
        s = s + 1
        If Len(n2) > s * 12 Then
            b2(s) = Mid(n2, Len(n2) - s * 12 + 1, 12)
        Else
            b2(s) = Mid(n2, 1, Len(n2) - (s - 1) * 12)
        End If
    Next i
   
    '加法
    If f = 1 Then
        '按段相加,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) + Val(b2(i))
           
            '进位
            If Len(b1(i)) > 12 Then
                b1(i + 1) = Val(b1(i + 1)) + Val(Left(b1(i), Len(b1(i)) - 12))
                b1(i) = Right(b1(i), 12)
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    '减法
    Else
        '按段相減,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) - Val(b2(i))
           
            '借位
            If b1(i) < 0 Then
                b1(i + 1) = Val(b1(i + 1)) - 1
                b1(i) = Val(b1(i)) + 10 ^ 12
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    End If
    '去前0
    For i = 1 To Len(dsys)
        If Mid(dsys, i, 1) <> "0" Then
            dsys = Mid(dsys, i)
            Exit For
        End If
    Next i
End Function

'正整数字符串比较大小
Function dsbj(n1 As String, n2 As String) As Boolean
    dsbj = IIf(Len(n1) > Len(n2) Or Len(n1) = Len(n2) And n1 > n2, True, False)
End Function

【算法设计与分析】经典代码赏析【1】

什么样的代码才是好的代码?这是一个将永远继续下去的话题。就如艺术品从来都不仅仅是艺术,艺术级的代码从来都不只是技术问题。什么样的代码才是称得上“艺术级”的代码?没有标准答案。但也许如下几条或许能得到大...
  • theprinceofelf
  • theprinceofelf
  • 2011年08月22日 23:52
  • 3382

回溯算法的一些案例分析(c代码实现)

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为: 1、定义一个解空间,它包含问题的...
  • u010442328
  • u010442328
  • 2015年07月20日 13:59
  • 451

算法设计与分析之回溯法

[-] 一 回溯法 深度优先搜素                        简单概述详细描述回溯法应用 二 回溯法实现 - 递归和递推迭代                      ...
  • QQ1449301756
  • QQ1449301756
  • 2015年04月06日 18:09
  • 817

回溯算法的常见例题之《迷宫》

回溯算法的常见例题之《迷宫》 回溯算法——百度百科: 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤: 1 针对所给问题,定...
  • qq_26627671
  • qq_26627671
  • 2016年03月05日 22:11
  • 1184

小型迷宫实现---迷宫算法(递归回溯法)

首先我们来了解迷宫包含的算法—-回溯法 回溯法的基本思想: 对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的算法;当搜索到某个结点发现无法再继续搜索下去时,...
  • fern_girl
  • fern_girl
  • 2017年04月24日 11:14
  • 332

阶梯博弈算法详解(尼姆博弈进阶)

1.什么是阶梯博弈? 阶梯的序号如图所示,地面表示第0号阶梯。每次都可以将一个阶梯上的石子向其左侧移动任意个石子,没有可以移动的空间时(及所有石子都位于地面时)输。 2.阶梯博弈的算法 阶梯博弈...
  • qq_30241305
  • qq_30241305
  • 2016年07月19日 16:03
  • 1313

阶梯级收费算法

阶梯级收费算法
  • lovingshu
  • lovingshu
  • 2016年10月21日 15:05
  • 1083

回溯算法_01背包问题_Java实现

回溯算法也叫试探法,通俗的将就是一个方向的路一直往前走,能走则走,不能走则退回来换一个方向再试。一般的实现步骤是:针对一个问题定义解的空间,至少包含问题的一个最优解;用易于搜索的解空间结构,使得能用回...
  • ljmingcom304
  • ljmingcom304
  • 2015年12月15日 14:15
  • 3467

2014秋C++第19周 补充代码 回溯法走迷宫

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 问题...
  • sxhelijian
  • sxhelijian
  • 2015年01月07日 21:20
  • 3649

回溯法解0-1背包问题(王晓东算法例题)

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 整个解的空间相当于一个二叉树,左边是0,代表不取这个物品,右边是...
  • NK_test
  • NK_test
  • 2015年06月04日 23:30
  • 3196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:走阶梯算法设计(源码)
举报原因:
原因补充:

(最多只允许输入30个字)