背景
由于我的老人电脑装不了VisualStudio,也装不了GoLang,Eclipse,Pycharm等主流编译器,导致我只能被迫学习这个系统自带解释器的脚本语言,啥也不用管,可以直接运行!不过这门语言坑有点多。。。
代码
Rem 定义棋盘
Dim map(8,8)
Rem 定义日字路线
Dim direct(8,2)
Rem 路线初始化
direct(1,1)=1
direct(1,2)=2
direct(2,1)=1
direct(2,2)=-2
direct(3,1)=-1
direct(3,2)=2
direct(4,1)=-1
direct(4,2)=-2
direct(5,1)=2
direct(5,2)=1
direct(6,1)=2
direct(6,2)=-1
direct(7,1)=-2
direct(7,2)=1
direct(8,1)=-2
direct(8,2)=-1
Rem 棋盘初始化
For i=1 To 8
For j=1 To 8
map(i,j)=0
Next
Next
Rem 某位置的下一个点位有几种可能
Function Count(x,y)
c=0
For k=1 To 8
i=x+direct(k,1)
j=y+direct(k,2)
If i>=1 and i<=8 and j>=1 and j<=8 Then
If map(i,j)=0 Then
c=c+1
End If
End If
Next
Count=c
End Function
Rem 下一个结点的所有情况,按照其再下一个结点的可能数进行排序,贪心算法【选取可能性较少的优先尝试】
Function NextPoints(x,y)
Set list=CreateObject("System.Collections.ArrayList")
For k=1 To 8
i=x+direct(k,1)
j=y+direct(k,2)
If i>=1 and i<=8 and j>=1 and j<=8 Then
If map(i,j)=0 Then
ix=i
iy=j
ic=Count(ix,iy)
ie=ic&","&ix&","&iy
list.Add ie
End If
End If
Next
list.Sort()
Set NextPoints=list
End Function
Rem 深度优先递归搜索
Flag=False
Sub Dfs(x,y,now)
If now>64 Then
Exit Sub
End If
If Flag=True Then
Exit Sub
End If
map(x,y)=now
If now>=64 Then
Flag=True
Exit Sub
End If
Set nps=NextPoints(x,y)
For Each np In nps
p=Split(np,",")
nx=Cint(p(1))
ny=Cint(p(2))
Dfs nx,ny,(now+1)
If Flag=True Then
Exit Sub
Else
map(nx,ny)=0
End If
Next
End Sub
Rem 打印结果
Sub Display()
line=""
For i=1 To 8
For j=1 To 8
ix=i
iy=j
If map(ix,iy)<10 Then
line=line&"0"
End If
line=line&map(ix,iy)&" "
Next
line=line&chr(10)
Next
wsh.echo line
End Sub
Rem 主函数
Sub Main()
On Error Resume Next
pt=InputBox("初始坐标","马踏棋盘求解","1 1")
pt=Split(Trim(pt))
x=Cint(pt(0))
y=Cint(pt(1))
If x<1 or x>8 or y<1 or y>8 Then
wsh.echo "输入格式应为两个1-8的数字,并由1个空格分隔"
Exit Sub
End If
Dfs x,y,1
Display
If Err<>0 Then
wsh.echo "输入格式应为两个1-8的数字,并由1个空格分隔"
End If
End Sub
Main
运行
将代码复制到记事本中,并另存为"马踏棋盘.vbs",注意两点
1. 保存类型选择"所有文件"
2. 编码选择"ANSI"
接下来就可以双击它运行了
启动时会弹出框让你输入一个坐标,表示开始位置【坐标范围是1到8】,输入完毕后按回车键进行下一步,求解完毕后会弹框显示结果