2011年7月27日 星期三

Lotto

內容 : 正體->简体
為了呼應台灣電腦彩券的發行,我們再次推出跟組合有關的題目。你在買彩券的時候一定會挑你喜歡的數字吧!(雖然理論上不會增加你的中獎機率,但是你還是會 選擇你的Lucky Number)我們的問題是:假設共有49個號碼,而你必須在你的 k (k>6)個Lucky Number中挑6個號碼作為一張彩券的數字組合。例如:你的Lucky Number的集合是{1,2,3,5,8,13,21,34}以就是說 k=8 ,那麼你就有C(8,6)=28種可能的彩券組合:
[1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34].

你的任務是讀入k以及Lucky Number的集合,然後輸出所有可能的組合。

輸入說明 :
每筆測試資料一行,每行的第1個整數代表 k( 6 < k < 1 3 ) 。 接下來的k個整數代表Lucky Number的集合,此集合已經按數字由小到大排好。k=0代表輸入結束。

輸出說明 :
對每一筆測試資料,輸出其所有可能的組合,每個組合一行。請注意輸出組合的順序需由小到大排列。測試資料之間請空一行。請參考Sample Output。

範例輸入 :

7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0
範例輸出 :

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7

1 2 3 5 8 13
1 2 3 5 8 21
1 2 3 5 8 34
1 2 3 5 13 21
1 2 3 5 13 34
1 2 3 5 21 34
1 2 3 8 13 21
1 2 3 8 13 34
1 2 3 8 21 34
1 2 3 13 21 34
1 2 5 8 13 21
1 2 5 8 13 34
1 2 5 8 21 34
1 2 5 13 21 34
1 2 8 13 21 34
1 3 5 8 13 21
1 3 5 8 13 34
1 3 5 8 21 34
1 3 5 13 21 34
1 3 8 13 21 34
1 5 8 13 21 34
2 3 5 8 13 21
2 3 5 8 13 34
2 3 5 8 21 34
2 3 5 13 21 34
2 3 8 13 21 34
2 5 8 13 21 34
3 5 8 13 21 34

3 則留言:

  1. 排序後放入list1

    Dim Y() As String
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do
    Input #1, N
    If N = 0 Then Exit Do
    Line Input #1, X
    List1.Clear
    Y = Split(X)
    For i = (N - 2) To 1 Step -1
    For j = 0 To i
    If Val(Y(j)) > Val(Y(j + 1)) Then
    temp = Y(j)
    Y(j) = Y(j + 1)
    Y(j + 1) = temp
    End If
    Next
    Next

    For i = 0 To UBound(Y)
    List1.AddItem Y(i)
    Next i

    Call ABC("", 0, 0)
    Print #2, " "
    Loop Until N = 0
    Close #2
    Close #1
    End
    End Sub


    Sub ABC(ByVal A, ByVal B, ByVal C)
    If C = 6 Then
    Print #2, A
    Else
    For i = B To UBound(Y)
    If C < 6 Then Call ABC(A & " " & List1.List(i), i + 1, C + 1)
    Next i
    End If
    End Sub

    回覆刪除
  2. 佑好,
    程式正確。
    改進點:
    Input #1, N
    If N = 0 Then Exit Do
    Line Input #1, X
    同一行裡,先輸入1 個,再輸入其它的,會不會有些不確定性呢。
    還不如就
    Line Input #1, X
    If X = 0 Then
    Exit Do
    else
    才去split

    回覆刪除
  3. Dim s, nu
    Private Sub Form_Load()

    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Line Input #1, n
    s = Split(n)
    Call Lot(0, "")

    Loop

    Close
    Close

    End Sub

    Sub Lot(a, ans)
    If a = 6 Then
    Call fin(ans)
    Else
    For i = 1 To s(0)
    If InStr(ans, s(i)) = 0 Then Call Lot(a + 1, ans & " " & s(i))
    Next
    End If

    End Sub

    Sub fin(a)
    Dim m, k
    m = Split(a)
    k = 1
    For i = UBound(m) To 1 Step -1
    If Val(m(i)) < Val(m(i - 1)) Then k = 0
    Next
    If k = 1 Then Print #2, a
    End Sub

    回覆刪除