2011年7月18日月曜日

基本情報技術者 平成23年特別 午後 問8

--------------------------------------------------------------------------------------------------
以下の解説、解法が間違っていても責任は取れません
発見した場合はコメント欄よりご指摘下さい
--------------------------------------------------------------------------------------------------

多分だけどこれをVBAに貼り付けてウォッチ式の中身を見れば理解できるはず
未だによく理解してない(汗

①最初はInitで11100になる
②10と連続になるポイントが配列の3番目と4番目で、該当した場合は値を入れ替える
③入れ替えたらその時の1の順番3の手前(-1する)と11で連続した場合のカウントを引数にInit
④繰り返し...

よく分からない(;´д`)てか免土井

Private Sub test()

    Dim S(5) As String
    Dim N As Integer
    Dim K As Integer
    Dim R As Integer
    
    S(0) = "ダミー"
    S(1) = ""
    S(2) = ""
    S(3) = ""
    S(4) = ""
    S(5) = ""
    N = 5
    K = 3
    
    R = init(S, N, K)
    
    While R = 0
    
        R = nextX(S, N)
    
    Wend

End Sub

Private Function init(ByRef S() As String, _
                      ByVal N As Integer, _
                      ByVal K As Integer) As Integer

    Dim L As Integer
    
    If 1 <= K And K <= N Then
    
        For L = 1 To N Step 1
        
            If L <= K Then
            
                S(L) = 1
                
            Else
            
                S(L) = 0
                
            End If
        
        Next L
        
        init = 0
        
    Else
    
        init = 1
    
    End If

End Function

Private Function nextX(ByRef S() As String, _
                       ByVal N As Integer) As Integer

    Dim C As Integer
    Dim L As Integer
    Dim R As Integer
    
    C = 0
    L = 1
    R = -1
    
    While (L < N) And (R = -1)
    
        If S(L) = 1 Then
        
            If S(L + 1) = 0 Then
            
                S(L) = 0
                
                S(L + 1) = 1
                
                Call init(S, L - 1, C)
                
                R = 0
            
            Else
            
            C = C + 1
            
            End If
            
        End If
        
        L = L + 1
    
    Wend

    nextX = R

End Function

SLC
11100,3-1,2
11010,
11010,

11010,2-1,1
10110,
10110,

10110,0-1,0
01110,
01110,

01110,4-1,2
01101,
11001,

11001,2-1,1
10101,
10101,

10101,0-1,0
01101,
01101,

01101,3-1,1
01011,
10011,

10011,0-1,0
01011,
01011,

01011,2-1,0
00111,おわり

0 件のコメント:

コメントを投稿