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