[不如跳舞舞蹈分解动作]怎么学习舞蹈——跳舞的技巧
[不如跳舞舞蹈分解动作]怎么学习舞蹈——
跳舞的技巧
篇一 : 怎么学习舞蹈——跳舞的技巧
文章导读本文关键字:跳舞的技巧
怎样跳得轻松流利 1、舞姿、舞感、舞韵与松、轻、飘、高是
摩登舞的意味,想要跳出醉人漂亮的舞姿,必需要深深的感受摩登舞
五大技巧的魅力,才干有端庄、委婉、稳健、典雅的作风和绅士风度。
As Integer, Right As Integer, Up As Integer, Down As Integer
Private Row As Integer, Col As Integer
Private _Head As Integer
Private _Rows As Integer, _Cols As Integer, _NodeCount As Integer
Private Ans As Integer
前两行
示每个元素的六个分量,用数组表示;_Head表示元
素Head,在类中初始化时令其等于0;_Rows表示矩阵的行数,_Cols
表示矩阵的列数,_NodeCount表示元素的个数;Ans用于存放
Public Function Dance As Integer
Return IIf = True, Ans, Nothing)
End Function
Private Function Dance As Boolean
Dim C1 As Integer = Right
If Then
ReDim Preserve Ans
Return True
End If
RemoveCol
Dim I As Integer, J As Integer
I = Down
Do While I C1
Ans = Row
J = Right
Do While J I
RemoveCol)
J = Right
Loop
If Dance Then Return True
J = Left
Do While J I
ResumeCol)
J = Left
Loop
I = Down
Loop
ResumeCol
Return False
End Function
其中第一个函数Dance是对外开放的函数,它通过调用Dance来求解问题,根据返回值来决定返回答案还是返回空
第二个函数是求解的主函数。首先通过Right获得_Head元素的右元素。判断是否等于自身,若是,求解结束,因为答案保存在Ans到Ans中,所以先把答案数组中多余的部分去除。
RemoveCol函数是用来标示列首元素的,ResumeCol函数用来回标列首元素的,其中通过Col获得J元素的列首元素。在函数中有个很聪明的
,在标示列首元素时,顺序是从I元素的右侧元素开
始;而在回标列首元素时,顺序是从I元素的左侧元素开始,正好顺序和标示列首元素的顺序相反。
在调用Dance前,把当前选中的行保存到Ans中,当Dance返回True时,说明递归调用获得正确的解,那直接返回True;返回False时,说明当前选择的行不正确,回标列首元素,获得下一个元素。
当元素C1中所在的列的其余元素所选定的行没有求解正确的递归函数时,说明当前的求解失败,回标列首元素C1,返回False
Public Sub RemoveCol
Left) = Left
Right) = Right
Dim I As Integer, J As Integer
I = Down
Do While I Col
J = Right
Do While J I
Up) = Up
Down) = Down
J = Right
Loop
I = Down
Loop
End Sub
首先,利用Left) = Left 和Right) = Right 把列首元素Col从水平双向链中移除出去。再依次把Col所在的列的其余元素的所在行的其余元素从垂直双向链中移除出去,利用的是Up) = Up 和Down) = Down。找寻Col所在列的其余元素的顺序是从下边开始,移除所在行其余元素的顺序是从右边开始 。可以参考之前的图中的紫色部分。
Public Sub ResumeCol
Left) = Col
Right) = Col
Dim I As Integer, J As Integer
I = Up
Do While
J = Right
Do While J I
Up) = J
Down) = J
J = Right
Loop
I = Up
Loop
End Sub
首先,利用Left) = Col 和Right) = Col 把列首元素Col恢复到水平双向链中。再依次把Col所在的列的其余元素的所在行的其余元素恢复到垂直双向链中,利用的是Up) = J 和Down) = J。找寻Col所在列的其余元素的顺序是从上边开始,恢复所在行其余元素的顺序是从右边开始 。
Public Sub New
ReDim Left, Right, Up, Down, Row, Col, Ans
Dim I As Integer
Up = 0
Down = 0
Right = 1
Left = Cols
For I = 1 To Cols
Up = I
Down = I
Left = I - 1
Right = I + 1
Col = I
Row = 0
Next
Right = 0
_Rows = 0
_Cols = Cols
_NodeCount = Cols
_Head = 0
End Sub
初始化函数有一个参数Cols,表示这个矩阵的列数。
初始化的时候,由于没有传入矩阵元素的信息。因此,在该函数中先把辅助元素完成
0表示Head元素,1-Cols表示Cols个列的列首元素
第一句,重定义六个分量的数组,表示Head元素和列首元素的六个分量。
Right = 1表示Head元素的Right分量指向列首元素1;Left = Cols表示Head元素的Left分量指向列首元素Cols
后面的一段循环,给每个列首元素指定六个分量。Up和Down分量指向自己,Left分量指向左边的列首元素,Right分量指向右边
的列首元素,Col分量指向自己,Row分量为0,参看前面的图。最
后Right=0,Cols列的列首元素的Right分量指向Head元素
其后是一些变量的赋值。把_Head赋值为0,表示0为Head元
素,是为了后面的代码的直观性
Public Sub AppendLine As Integer)
_Rows += 1
If Value.Length = 0 Then Exit Sub
Dim I As Integer, K As Integer = 0
For I = 0 To Value.Length - 1
If Value = 1 Then
_NodeCount += 1
ReDim Preserve Left
ReDim Preserve Right
ReDim Preserve Up
ReDim Preserve Down
ReDim Preserve Row
ReDim Preserve Col
ReDim Preserve Ans
If K = 0 Then
Left = _NodeCount
Right = _NodeCount
K = 1
Else
Left = _NodeCount - 1
Right = Right
Left) = _NodeCount
Right = _NodeCount
End If
Down = I + 1
Up = Up
Down) = _NodeCount
Up = _NodeCount
Row = _Rows
Col = I + 1
End If
Next
End Sub
把矩阵的一行元素添加到类中
在前文中介绍了Dancing Links中只存储1的元素,因此,在添加的时候,先判断值是否是1。
那实际上问题是如何把元素添加到双向链中,在添加的过程中,自左向右添加。
先考量如何把元素添加到水平双向链中
当添加这一行的第一个元素时,由于还没有双向链,首先构造一个只有一个元素的双向链。Left = _NodeCount和Right = _NodeCount。这个元素的Left和Right分量都指向自己。
从第二个元素开始。问题就转换为把元素添加到水平双向链的末尾,实际上需要知道之前的水平双向链的最左边的元素和最右边的元素,可以肯定的是最右边的元素是_NodeCount-1,最左边的元素是什么,之前并没有缓存啊。由于是循环双向链,Right就是这双向链的最左边的元素。Left = _NodeCount - 1,把当前元素的Left分量指向最右边的元素即_NodeCount-1;Right = Right ,把当前元素的Right分量指向最左边的元素即Right;Left) = _NodeCount,把最左边的元素即Right的Left分量指向当前元素;Right = _NodeCount,把最右边的元素即_NodeCount-1的Right分量指向当前元素
再考量如何把元素添加到垂直双向链
同样,问题就转换为把元素添加到垂直双向链的末尾,实际上
需要知道之前的垂直双向链的最上边的元素和最下边的元素。和水平双向链的不同,我们没法知道最下边的元素,但是我们可以利用列首元素知道最上边的元素。因此,最上边的元素是I+1,那么最下边的元素就是Up。Down = I + 1,把当前元素的Down分量指向最上边的元素即I+1;Up = Up ,把当前元素的Up分量指向最下边的元素即Up;Down) = _NodeCount,把最下边元素即Up的Down分量指向当前元素;Up = _NodeCount,把最上边元素即I+1的Up分量指向当前元素
至此,完成了把当前元素添加到两个双向链的过程
最后,给当前元素的Row分量和Col分量赋值
在文首的题目中,添加第一行的数据,如下调用
AppendLine
如果一行中有大量的0,那么用下面的函数比较方便
Public Sub AppendLineByIndex As Integer)
_Rows += 1
If Index.Length = 0 Then Exit Sub
Dim I As Integer, K As Integer = 0
ReDim Preserve Left
ReDim Preserve Right
ReDim Preserve Up
ReDim Preserve Down
ReDim Preserve Row
ReDim Preserve Col
ReDim Preserve Ans
For I = 0 To Index.Length - 1
_NodeCount += 1
If I = 0 Then
Left = _NodeCount
Right = _NodeCount
Else
Left = _NodeCount - 1
Right = Right
Left) = _NodeCount
Right = _NodeCount
End If
Down = Index
Up = Up)
Down)) = _NodeCount
Up) = _NodeCount
Row = _Rows
Col = Index
Next
End Sub
该函数的参数是这一行中值为1的元素的所在列的下标,具体就不再解释了。和AppendLine函数类似。
在文首的题目中,添加第一行的数据,如下调用
AppendLineByIndex
和AppendLine效果相同。
下面的代码是调用该类求解文首题目的代码
Dim tS As New clsDancingLinks
tS.AppendLineByIndex
tS.AppendLineByIndex
tS.AppendLineByIndex
tS.AppendLineByIndex
tS.AppendLineByIndex
tS.AppendLineByIndex
Dim Ans As Integer = tS.Dance
Ans数组中的值是4,5,1
至此,求解精确覆盖问题的Dancing Links算法就介绍完了。
利用十字循环双向链这个特殊的数据结构,不可思议的完成了缓存矩
阵和回溯矩阵的过程,十分优雅,十分高效。故Donald E.Knuth把它
称为Dancing Links。我更喜欢跳跃的舞者这个名字
有很多问题都能转换为精确覆盖问题,再利用Dancing Links
算法求解就方便多了。
最后,把该类的完整代码贴在下方
Public Class clsDancingLinks
Private Left As Integer, Right As Integer, Up As Integer, Down
As Integer
Private Row As Integer, Col As Integer
Private _Head As Integer
Private _Rows As Integer, _Cols As Integer, _NodeCount As Integer
Private Ans As Integer
Public Sub New
ReDim Left, Right, Up, Down, Row, Col, Ans
Dim I As Integer
Up = 0
Down = 0
Right = 1
Left = Cols
For I = 1 To Cols
Up = I
Down = I
Left = I - 1
Right = I + 1
Col = I
Row = 0
Next
Right = 0
_Rows = 0
_Cols = Cols
_NodeCount = Cols
_Head = 0
End Sub
Public Sub AppendLine As Integer)
_Rows += 1
If Value.Length = 0 Then Exit Sub
Dim I As Integer, K As Integer = 0
For I = 0 To Value.Length - 1
If Value = 1 Then
_NodeCount += 1
ReDim Preserve Left
ReDim Preserve Right
ReDim Preserve Up
ReDim Preserve Down
ReDim Preserve Row
ReDim Preserve Col
ReDim Preserve Ans
If K = 0 Then
Left = _NodeCount
Right = _NodeCount
K = 1
Else
Left = _NodeCount - 1
Right = Right
Left) = _NodeCount
Right = _NodeCount
End If
Down = I + 1
Up = Up
Down) = _NodeCount
Up = _NodeCount
Row = _Rows
Col = I + 1
End If
Next
End Sub
Public Sub AppendLineByIndex As Integer)
_Rows += 1
If Index.Length = 0 Then Exit Sub
Dim I As Integer, K As Integer = 0
ReDim Preserve Left
ReDim Preserve Right
ReDim Preserve Up
ReDim Preserve Down
ReDim Preserve Row
ReDim Preserve Col
ReDim Preserve Ans
For I = 0 To Index.Length - 1
_NodeCount += 1
If I = 0 Then
Left = _NodeCount
Right = _NodeCount
Else
Left = _NodeCount - 1
Right = Right
Left) = _NodeCount
Right = _NodeCount
End If
Down = Index
Up = Up)
Down)) = _NodeCount
Up) = _NodeCount
Row = _Rows
Col = Index
Next
End Sub
Public Function Dance As Integer
Return IIf = True, Ans, Nothing)
End Function
Private Function Dance As Boolean
Dim C1 As Integer = Right
If Then
ReDim Preserve Ans
Return True
End If
RemoveCol
Dim I As Integer, J As Integer
I = Down
Do While I C1
Ans = Row
J = Right
Do While J I
RemoveCol)
J = Right
Loop
If Dance Then Return True
J = Left
Do While J I
ResumeCol)
J = Left
Loop
I = Down
Loop
ResumeCol
Return False
End Function
Public Sub RemoveCol
Left) = Left
Right) = Right
Dim I As Integer, J As Integer
I = Down
Do While I Col
J = Right
Do While J I
Up) = Up
Down) = Down
J = Right
Loop
I = Down
Loop
End Sub
Public Sub ResumeCol
Left) = Col
Right) = Col
Dim I As Integer, J As Integer
I = Up
Do While
J = Right
Do While J I
Up) = J
Down) = J
J = Right
Loop
I = Up
Loop
End Sub
End Class
篇三 : 在迪厅如何跳舞,求动作教程
在迪厅如何跳舞,求动作教程
随意来