Private Function calcb(a() As Long, b() As Long) As Long()
'确定数组长度
Dim bc As Long
bc = UBound(b)
'定义方向数组
Dim a_b(8) As Integer
'初始化 9个方向 0~8 作用于数组中的相对位置,注 方向0代表指向自己 或者说没有父结点
a_b(6) = -5: a_b(7) = -4: a_b(8) = -3
a_b(5) = -1: a_b(0) = 0: a_b(1) = 1
a_b(4) = 3: a_b(3) = 4: a_b(2) = 5
'bsp 数组代表某个节点拥有儿子结点状况,bcd数组代表某个结点是否被计算过
Dim bsp() As Byte, bcd() As Boolean, c() As Long
c = b
ReDim bsp(bc), bcd(bc)
'初始化 结点状态
Dim i As Long, t As Long, Stoploop As Boolean
For i = 0 To bc
t = a(i)
If t > 0 And (c(i) <> -9999) Then
t = 2 ^ (t - 1)
bsp(i + a_b(a(i))) = bsp(i + a_b(a(i))) Or t '累计儿子结点状况 最多8个 即当bsp(i)=255 或者 11111111(二进制)
End If
Next i
'开始正式转换
Do
Stoploop = True
For i = 0 To bc
If Not bcd(i) And (c(i) <> -9999) Then '判断是否计算过
If bsp(i) = 0 Then '判断结点是否是根结点
If c(i) < 0 Then c(i) = 0 '处理小于0的
bcd(i) = True
t = a(i)
If t > 0 Then
t = 2 ^ (t - 1)
c(i + a_b(a(i))) = c(i + a_b(a(i))) + c(i)
bsp(i + a_b(a(i))) = bsp(i + a_b(a(i))) Xor t
Stoploop = False
End If
End If
End If
Next i
Print
Loop Until Stoploop
calcb = c()
End FunctionPrivate Sub Command1_Click()
Dim a() As Long, b() As Long, c() As Long
'初始化数组,我这里就直接调用你提供的数据,不从文件读取了
ReDim a(19), b(19)
a(0) = -9999: a(1) = 3: a(2) = 4: a(3) = -9999
a(4) = 1: a(5) = 3: a(6) = 3: a(7) = -9999
a(8) = -9999: a(9) = 1: a(10) = 2: a(11) = 3
a(12) = 8: a(13) = 7: a(14) = 1: a(15) = 3
a(16) = 7: a(17) = -9999: a(18) = -9999: a(19) = 0
b(0) = -9999: b(1) = -3: b(2) = -9999: b(3) = -9999
b(4) = 3: b(5) = -7: b(6) = 5: b(7) = -9999
b(8) = -9999: b(9) = 4: b(10) = -15: b(11) = 0
b(12) = 2: b(13) = -4: b(14) = 5: b(15) = 1
b(16) = -1: b(17) = -9999: b(18) = -9999: b(19) = 1
c = calcb(a(), b())
For i = 0 To UBound(c)
Debug.Print c(i),
If i Mod 4 = 3 Then Debug.Print
Next i
End Sub输出结果-9999 0 -9999 -9999
3 0 5 -9999
-9999 6 0 0
2 0 5 6
0 -9999 -9999 7 实现的是这样一个计算过程,-9999相当于空数据。
-3
↓
3 → -7 5
↓ ↓
4 → -15 0
↗ ↑ ↘↓
2 -4 5 →1
↑ ↓
-1 1程序运行没有问题,主要想把一维的操作改为二维的操作。因为我的数据比较大,超过一维的最大存储量。我对程序的主体部分有点不太懂,请高手帮下忙。
对程序有什么不懂的话可以看以下帖子
http://community.csdn.net/Expert/topic/5650/5650790.xml?temp=5.923098E-02
'确定数组长度
Dim bc As Long
bc = UBound(b)
'定义方向数组
Dim a_b(8) As Integer
'初始化 9个方向 0~8 作用于数组中的相对位置,注 方向0代表指向自己 或者说没有父结点
a_b(6) = -5: a_b(7) = -4: a_b(8) = -3
a_b(5) = -1: a_b(0) = 0: a_b(1) = 1
a_b(4) = 3: a_b(3) = 4: a_b(2) = 5
'bsp 数组代表某个节点拥有儿子结点状况,bcd数组代表某个结点是否被计算过
Dim bsp() As Byte, bcd() As Boolean, c() As Long
c = b
ReDim bsp(bc), bcd(bc)
'初始化 结点状态
Dim i As Long, t As Long, Stoploop As Boolean
For i = 0 To bc
t = a(i)
If t > 0 And (c(i) <> -9999) Then
t = 2 ^ (t - 1)
bsp(i + a_b(a(i))) = bsp(i + a_b(a(i))) Or t '累计儿子结点状况 最多8个 即当bsp(i)=255 或者 11111111(二进制)
End If
Next i
'开始正式转换
Do
Stoploop = True
For i = 0 To bc
If Not bcd(i) And (c(i) <> -9999) Then '判断是否计算过
If bsp(i) = 0 Then '判断结点是否是根结点
If c(i) < 0 Then c(i) = 0 '处理小于0的
bcd(i) = True
t = a(i)
If t > 0 Then
t = 2 ^ (t - 1)
c(i + a_b(a(i))) = c(i + a_b(a(i))) + c(i)
bsp(i + a_b(a(i))) = bsp(i + a_b(a(i))) Xor t
Stoploop = False
End If
End If
End If
Next i
Loop Until Stoploop
calcb = c()
End FunctionPrivate Sub Command1_Click()
Dim a() As Long, b() As Long, c() As Long
'初始化数组,我这里就直接调用你提供的数据,不从文件读取了
ReDim a(19), b(19)
a(0) = -9999: a(1) = 3: a(2) = 4: a(3) = -9999
a(4) = 1: a(5) = 3: a(6) = 3: a(7) = -9999
a(8) = -9999: a(9) = 1: a(10) = 2: a(11) = 3
a(12) = 8: a(13) = 7: a(14) = 1: a(15) = 3
a(16) = 7: a(17) = -9999: a(18) = -9999: a(19) = 0
b(0) = -9999: b(1) = -3: b(2) = -9999: b(3) = -9999
b(4) = 3: b(5) = -7: b(6) = 5: b(7) = -9999
b(8) = -9999: b(9) = 4: b(10) = -15: b(11) = 0
b(12) = 2: b(13) = -4: b(14) = 5: b(15) = 1
b(16) = -1: b(17) = -9999: b(18) = -9999: b(19) = 1
c = calcb(a(), b())
For i = 0 To UBound(c)
Debug.Print c(i),
If i Mod 4 = 3 Then Debug.Print
Next i
End Sub输出结果-9999 0 -9999 -9999
3 0 5 -9999
-9999 6 0 0
2 0 5 6
0 -9999 -9999 7 实现的是这样一个计算过程,-9999相当于空数据。
-3
↓
3 → -7 5
↓ ↓
4 → -15 0
↗ ↑ ↘↓
2 -4 5 →1
↑ ↓
-1 1程序运行没有问题,主要想把一维的操作改为二维的操作。因为我的数据比较大,超过一维的最大存储量。我对程序的主体部分有点不太懂,请高手帮下忙。
对程序有什么不懂的话可以看以下帖子
http://community.csdn.net/Expert/topic/5650/5650790.xml?temp=5.923098E-02
文件太大了,我没有放那么大的邮箱。能否QQ传,我的qq:
408067232