VBScript求解马踏棋盘问题

背景

由于我的老人电脑装不了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】,输入完毕后按回车键进行下一步,求解完毕后会弹框显示结果

 

猜你喜欢

转载自blog.csdn.net/qq_36694133/article/details/130670973
今日推荐