主题:[Help]分治算法的一道题
Manderling
[专家分:0] 发布于 2006-07-19 01:09:00
[size=5][/size][size=4][size=3]考虑国际象棋棋盘上某个位置的一匹马,它是否可能只走63步,正好走过出起点外的其他63个位置各一次?<麻烦请给出源程序>谢谢~[em3][/size][/size]
回复列表 (共9个回复)
沙发
dongbili [专家分:30] 发布于 2006-07-19 20:33:00
我怎么觉得是广搜?
板凳
dongbili [专家分:30] 发布于 2006-07-19 20:34:00
深搜好象也行。
3 楼
Manderling [专家分:0] 发布于 2006-07-20 00:26:00
题目要求用分治....
4 楼
dongbili [专家分:30] 发布于 2006-07-21 12:55:00
递归搜索是否可以算做分治?
5 楼
火焰舞者 [专家分:0] 发布于 2006-07-23 15:14:00
呵呵 我是菜鸟来的 我想问一下 什么是 分治
6 楼
淡淡的 [专家分:2030] 发布于 2006-07-24 16:16:00
说明: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 楼
淡淡的 [专家分:2030] 发布于 2006-07-24 16:31:00
补充说明:现在b(1)="11",即起点是点(1,1),
如b(1)="35",则起点就变为(3,5),
你可通过改变b(1)的值,来改变起点。
8 楼
Manderling [专家分:0] 发布于 2006-07-26 22:47:00
很感谢~
9 楼
淡淡的 [专家分:2030] 发布于 2006-08-01 18:40:00
我的计算机内存太小,无法把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
我来回复