回 帖 发 新 帖 刷新版面

主题:[Help]分治算法的一道题

[size=5][/size][size=4][size=3]考虑国际象棋棋盘上某个位置的一匹马,它是否可能只走63步,正好走过出起点外的其他63个位置各一次?<麻烦请给出源程序>谢谢~[em3][/size][/size]

回复列表 (共9个回复)

沙发

我怎么觉得是广搜?

板凳

深搜好象也行。

3 楼

题目要求用分治....

4 楼

递归搜索是否可以算做分治?

5 楼

呵呵  我是菜鸟来的  我想问一下  什么是 分治 

6 楼


说明:1.这个程序是按马走日编写的,因我不知道马的移动规则。如果不对,你可修改s0,t0的值,使其按规则走。
2.这个程序可以输出所有可能的路线,但我的计算机不行,不知要多少时间才能出结果,希望你的计算机可以。
3.为了说明这个程序是可行的,这里设置了一条演示路线,你只要按下面说的办就可以看到它:
  a.把程序中被锁住的两个语句解开。
  b.在窗体上加一个按钮。
  c.运行程序后,点一下按钮,棋子就可走一步。
4.希望把你的运行结果告诉我,如果对程序还有什么要求请说明,我很高兴与你交流。
Public s0, t0, f, u, c
Private Sub Form_Activate()
Dim a(10000000), b(10000000), p(8, 8)
b(1) = "11":
k = 1: y = 0
For z = 1 To 63
'If k > 1 Then k = 1
For u = 1 To k: a(u) = b(u): Next u
For u = 1 To k
For j = 1 To 8: For i = 1 To 8: p(i, j) = "0": Next i: Next j
d = Len(a(u)): d = d / 2
For i = 1 To d
s = Mid(a(u), i * 2 - 1, 1)
t = Mid(a(u), i * 2, 1)
p(s, t) = "1"
Next i
s0 = s + 2: t0 = t + 1: Call uu(p, b, a)
s0 = s + 1: t0 = t + 2: Call uu(p, b, a)
s0 = s - 1: t0 = t + 2: Call uu(p, b, a)
s0 = s - 2: t0 = t + 1: Call uu(p, b, a)
s0 = s - 2: t0 = t - 1: Call uu(p, b, a)
s0 = s - 1: t0 = t - 2: Call uu(p, b, a)
s0 = s + 1: t0 = t - 2: Call uu(p, b, a)
s0 = s + 2: t0 = t - 1: Call uu(p, b, a)
Next u
k = f: f = 0
Next z
For i = 1 To k: Print b(i): Next i
'c = b(1)
End Sub
Sub uu(p, b, a)
If s0 > 0 And s0 < 9 And t0 > 0 And t0 < 9 Then
   If p(s0, t0) = "0" Then
     f = f + 1
     b(f) = a(u) + Trim(s0) + Trim(t0)
   End If
End If
End Sub
Private Sub Command1_Click()
Static j, m0, n0
For i = 0 To 8
Line (500 * (i + 1), 500)-(500 * (i + 1), 4500)
Line (500, 500 * (i + 1))-(4500, 500 * (i + 1))
Next
i = Len(c): i = i / 2
If j < i Then
m = Mid(c, j * 2 + 1, 1): m = 500 * (m + 1) - 250
n = Mid(c, j * 2 + 2, 1): n = 500 * (n + 1) - 250
Circle (m, n), 50
If m > 0 And m0 > 0 Then
Line (m0, n0)-(m, n)
End If
m0 = m: n0 = n
j = j + 1
End If
End Sub


7 楼

补充说明:现在b(1)="11",即起点是点(1,1),
          如b(1)="35",则起点就变为(3,5),
          你可通过改变b(1)的值,来改变起点。

8 楼

很感谢~

9 楼

我的计算机内存太小,无法把6楼的程序运行到底,但接力运行后,很快找到一条可走62步的路线,你只要在窗体上加个按钮,运行下面的程序,就可体会到走62步的乐趣和遗憾。希望你能找出63步的走法并告诉我们。

Public c
Private Sub Command1_Click()
Static j, m0, n0
For i = 0 To 8
Line (500 * (i + 1), 500)-(500 * (i + 1), 4500)
Line (500, 500 * (i + 1))-(4500, 500 * (i + 1))
Next
i = Len(c): i = i / 2
If j < i Then
m = Mid(c, j * 2 + 1, 1): m = 500 * (m + 1) - 250
n = Mid(c, j * 2 + 2, 1): n = 500 * (n + 1) - 250
Circle (m, n), 50
If m > 0 And m0 > 0 Then
Line (m0, n0)-(m, n)
End If
m0 = m: n0 = n
j = j + 1
End If
End Sub
Private Sub Form_Load()
c= "482715365778668768472816375846678876553426381725132142638465867453452412335475837152445677856472513211233143351422416281736182"
End Sub


我来回复

您尚未登录,请登录后再回复。点此登录或注册