2011年11月8日 星期二

99正式 Problem 5:特定排序方式的應用


若現在有 8張撲克牌,點數分別是 1點至 8點,各張牌的點數都不同,並且 8張牌已依點數由小到大排列。選手若要改變排列順序,只能用「插牌」動作。假設一個「插牌」的動作,可以將順序中的第 1張牌(首牌)插入其他牌的後面,形成 1個新的牌組順序。我們現在用 1個長度為 8的字串,表示 1個牌組順序。例如以字串「 12345678」,表示這 8張牌現在依其點數由小到大排列。如果我們進行第 1次「插牌」動作,假設將「牌 1」(首牌)放到「牌 5」之後,就形成新的牌組順序「23451678」。如果要進行第 2次的「插牌」,就將「牌 2」(首牌)插入其他牌之後,即可形成下一個牌組順序。現在給一個「目的地牌組順序」,請從牌組順序「12345678」開始,用最多 7次的「插牌」動作,最後轉換成「目的地牌組順序」。
輸入說明:第 1行為給定的「目的地牌組順序」字串(長度為 8)。
輸出說明:第 1行輸出「起始牌組順序」(12345678),最後 1行輸出給定的「目的地牌組順序」。第 2行起依序輸出每次「插牌」後的牌組順序。(答案並非唯一,評分時會逐行檢查正確性。)



輸入檔案 1:【檔名:in1.txt】
62518473


輸入檔案 2:【檔名:in2.txt】
42315678


輸出檔案:【檔名:out.txt】

12345678
23456718
34567218
45672183
56721843
67251843
76251843
62518473


12345678
23415678
34215678
42315678

3 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in1.txt" For Input As #1
    Open App.Path & "\in2.txt" For Input As #2
    Open App.Path & "\out.txt" For Output As #3



    Input #1, X
    List1.AddItem X
    For i = 7 To 1 Step -1
    X = Replace(X, i, "")
    X = i & X
    If re(X) = False Then List1.AddItem X
    Next i

    For i = List1.ListCount - 1 To 0 Step -1
    Print #3, List1.List(i)
    Next i

    Print #3,

    List1.Clear
    Input #2, X
    List1.AddItem X
    For i = 7 To 1 Step -1
    X = Replace(X, i, "")
    X = i & X
    If re(X) = False Then List1.AddItem X
    Next i

    For i = List1.ListCount - 1 To 0 Step -1
    Print #3, List1.List(i)
    Next i

    Close #3
    Close #2
    Close #1
    End
    End Sub

    Function re(A)
    P = False
    For i = 0 To List1.ListCount - 1
    If List1.List(i) = A Then P = True: Exit For
    Next i
    re = P
    End Function


    out.txt

    12345678
    23456718
    34567218
    45672183
    56721843
    67251843
    76251843
    62518473

    12345678
    23456718
    34567218
    45672318
    56742318
    67423158
    74231568
    42315678

    回覆刪除
  2. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in1.txt" For Input As #1
    Open App.Path & "\in2.txt" For Input As #3
    Open App.Path & "\out.txt" For Output As #2
    Input #1, n
    Call A1(n)
    Print #2, ""
    Input #3, n
    Call A1(n)
    Close
    Close
    End
    End Sub

    Sub A1(a)
    Dim org, cc(8), s(8), cs(8) As Integer
    org = Split("X 1 2 3 4 5 6 7 0")
    For i = 1 To 8
    m = Mid(a, i, 1): cc(i) = m
    If m = "8" Then cs(i) = m
    Next
    Q = 1

    Print #2, org(1) & org(2) & org(3) & org(4) & org(5) & org(6) & org(7) & "8"
    Do
    ans = ""


    For i = 1 To 8
    If org(Q) = cc(i) Then cs(i) = org(Q): org(Q) = 0: Exit For
    Next

    For i = 1 To 8
    If org(i) <> 0 Then ans = ans & org(i)
    Next
    For i = 1 To 8
    If cs(i) <> 0 Then ans = ans & cs(i)
    Next

    Print #2, ans
    Q = Q + 1


    Loop Until Q = 8
    End Sub

    回覆刪除
  3. output :

    12345678
    23456718
    34567218
    45672183
    56721843
    67251843
    76251843
    62518473

    12345678
    23456718
    34567218
    45672318
    56742318
    67423158
    74231568
    42315678

    回覆刪除