在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题。

在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完棋盘上所有空格的路径。

思路就是选角落的一格为起点,把所有能走的路全部路径全部试一遍。要试8^63次,计算时间太长了。把棋盘调成5x5的,比较好算。另外书里提示,根据空格的可访问的难易(难易由周围可访问它的空格数来决定),先选择更难访问的空格访问。

下面是完全遍历一遍的方法。

Option Explicit
Option Base 1

Dim stepmax As Integer
Const n = 8
Dim anw As Integer

Private Sub Command1_Click()

    Dim x As Integer
    Dim y As Integer

    Dim step As Integer
    Dim c(n, n) As Integer

    x = 1
    y = 1
    step = 1

    c(x, y) = step

    Call knightsol(x, y, step, c())
    Text2.Text = stepmax
    Label1.Caption = anw
End Sub

Private Sub knightsol(ByVal x As Integer, ByVal y As Integer, ByVal step As Integer, c() As Integer)
    Dim i As Integer
    Dim xt As Integer, yt As Integer, stept As Integer
    'List1.AddItem ("-------------------------")

    For i = 1 To 8
        xt = x
        yt = y
        stept = step
        'List1.AddItem ("当前位置为" & "(" & x & "," & y & ")")
        Call mv(i, x, y)
        'List1.AddItem ("-- 往" & i & "方向移动到" & "(" & x & "," & y & ")")
        If x > 0 And x <= n And y > 0 And y <= n Then
            If c(x, y) = 0 Then
                step = step + 1
                c(x, y) = step
                'List1.AddItem ("-- 赋值" & x & "," & y & "为" & step)
                If step > stepmax Then
                    stepmax = step
                End If

                If step = n * n Then
                    'List1.AddItem ("目的完成输出路径")
                    'List1.AddItem ("-------------")
                    Call path(c())
                    c(x, y) = 0
                    MsgBox ("找到了")
                    anw = anw + 1
                    Exit Sub
                End If
                Call knightsol(x, y, step, c())
                'Call path(c())
                'List1.AddItem ("还原c(" & x & "," & y & ")")
                c(x, y) = 0
                x = xt
                y = yt
                step = stept
                'List1.AddItem ("-------------------------")
            Else
                'List1.AddItem ("** 被占用了")
                x = xt
                y = yt
            End If
        Else
            'List1.AddItem ("** 越界了")
            x = xt
            y = yt
        End If
    Next

End Sub

Private Sub mv(i As Integer, x As Integer, y As Integer)

    Select Case i
    Case 1
        x = x + 2
        y = y + 1
    Case 2
        x = x + 2
        y = y - 1
    Case 3
        x = x - 2
        y = y + 1
    Case 4
        x = x - 2
        y = y - 1
    Case 5
        x = x + 1
        y = y + 2
    Case 6
        x = x + 1
        y = y - 2
    Case 7
        x = x - 1
        y = y + 2
    Case 8
        x = x - 1
        y = y - 2
    End Select

End Sub

Private Sub path(c() As Integer)
    Dim a As Integer, b As Integer
    For a = 1 To n
        For b = 1 To n
            Text1.Text = Text1.Text & Format(c(a, b), "@@@")
        Next b
        Text1.Text = Text1.Text & vbCrLf
    Next a
    Text1.Text = Text1.Text & vbCrLf
End Sub

骑士游历/knight tour - visual basic 解决的更多相关文章

  1. POJ 2488 -- A Knight's Journey(骑士游历)

    POJ 2488 -- A Knight's Journey(骑士游历) 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 经典的“骑士游历”问题 ...

  2. 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

    看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...

  3. VS2017远程调试C#或 Visual Studio 中的 Visual Basic 项目

    来源:远程调试C#或 Visual Studio 中的 Visual Basic 项目 若要调试已部署在另一台计算机的 Visual Studio 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...

  4. 杂项-软件: VBA(Visual Basic for Applications)

    ylbtech-杂项-软件: VBA(Visual Basic for Applications) VBA (Visual Basic宏语言) Visual Basic for Application ...

  5. DFS(二):骑士游历问题

    在国际象棋的棋盘(8行×8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次.例如,下图给出了骑士从坐标(1,5)出发,游历棋盘的一种可能情况. [例1] ...

  6. Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010

    摘  要: SQL Server 2012 数据和Excel 2010之间的连接和数据的传输,本篇文章主要针对的是SQL Server 2012 数据导入到Excel 2010文件中.Excel软件对 ...

  7. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012

    (注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘  要:DataGridView控件作为数据传输的中介,只 ...

  8. Delphi、C C++、Visual Basic数据类型的对照 转

    Delphi.C C++.Visual  Basic数据类型的对照 变量类型 Delphi C/C++ Visual Basic 位有符号整数 ShortInt char -- 位无符号整数 Byte ...

  9. 2016年4月TIOBE编程语言排行榜 Visual Basic正渐行渐远

    COBOL, BASIC 和 FORTRAN 很长一段时间作为主力开发语言被使用.有很多软件使用这些语言来编写,并且发展的不亦乐乎.然而经过多年的发展,COBOL和FORTRAN逐渐被抛弃, 而得益于 ...

随机推荐

  1. Python验证码6位自动生成器

    Python验证码6位自动生成器

  2. Dynamic range compression

    这段时间终于把手头的东西都搞完了,还剩下一个AEC这个模块,这个模块跟整个系统机制有很大关系,单独的模块意义不大. 另外,刚写完一个分类器,希望能大幅提升音乐流派分类的准确率. 下周正式开搞AEC,把 ...

  3. spring jpa 实体互相引用返回restful数据循环引用报错的问题

    spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLa ...

  4. 设计模式--单例模式Singleton(创建型)

    单例模式很显然是定义一个类,这个类在程序中只有唯一的实例对象.一般单例类的构造函数是私有的,只能通过调用静态函数GetInstance来获取实例. 一.单例模式有三种:懒汉式单例.饿汉式单例.登记式单 ...

  5. appium for mobile web 之使用 ChromeDriver

    之前研究了一段时间的appium for native app 相应的总结如下:                                            appium测试环境搭建 :ht ...

  6. 使用Angular2理由

    1. 组件化 组件化编程是web 发展的一个趋势,Angular2提供高效简单的组件开发方式,使程序开发更加关注业务逻辑的实现,而不用关心如何加载组件和模块,如何引用及依赖注入的实现等. 如下代码所示 ...

  7. Path之Data属性语法A命令

    <Path Width="300" Height="300" Fill="Red" Data="M 100,100 L 10 ...

  8. Centos7设置关闭防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,要想使用iptables必须重新设置一下. 1.关闭防火墙 [root@localhost ~]# systemctl stop firew ...

  9. 【MongoDB】 基于C#官方驱动2.2版的封装类

    一.前言 最近项目中要用到MongoDB,因此实现做了不少的调研.发现网上很多现有关于MongoDB C#官方驱动的调用方法都是基于1.8版本的,已经不是用了最新的2.2版本.因此我在基于C#官方驱动 ...

  10. jQuery和AngularJS的区别小分析

    最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs ...