2011年11月8日 星期二

99正式 Problem 4:排列組合的應用


某個菜攤最多有 8種類型的商品出售。當類型齊全時,該 8種商品依序包括「肉」、「菜」、「蛋」、「果」、「魚」、「蝦」、「豆」及「菇」。假設當菜攤進了 n種類型商品,即表示菜攤進了 8種商品中的前 n種類型商品(例如:菜攤進了 3種類型商品,表示進了「肉」、「菜」及「蛋」等 3種商品。)。今將此 n類商品由左至右分類排列,但是:「肉果」、「肉豆」、「肉菇」、「菜蛋」、「菜魚」、「菜豆」、「菜菇」、「蛋果」、「蛋蝦」、「蛋菇」、「果魚」、「果豆」、「果菇」、「魚蝦」、「魚豆」、「魚菇」、「蝦豆」、「豆菇」此 18種商品組合,兩兩不可左右緊鄰放置(其間沒有擺設其他商品)。以第 1組「肉果」為例,「肉」不可放在「果」的「正左邊」或「正右邊」,而兩者之間沒有其他任何商品。在給定 n的條件下,請輸出共有那些商品排列方式。
輸入說明:第 1行的數字表示商品進貨種類 n,而 n的值介於 18之間。
輸出說明:從第 1行起每行輸出 1組符合條件的「商品排列」,每行輸出的「商品排列」間不限制是否有空白相隔,各種排列方式的輸出順序不限。最後 1行輸出總共有多少種排列方式(只輸出數字即可)。
輸入檔案 1:【檔名:in1.txt
3



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


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

菜肉蛋
蛋肉菜
2


蛋肉菜果
果菜肉蛋
2

2 則留言:

  1. Dim X() As String
    Dim Y() As String

    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
    X = Split("佔 肉 菜 蛋 果 魚 蝦 豆 菇")
    Y = Split("肉果 肉豆 肉菇 菜蛋 菜魚 菜豆 菜菇 蛋果 蛋蝦 蛋菇 果魚 果豆 果菇 魚蝦 魚豆 魚菇 蝦豆 豆菇 果肉 豆肉 菇肉 蛋菜 魚菜 豆菜 菇菜 果蛋 蝦蛋 菇蛋 魚果 豆果 果菇 蝦魚 豆魚 菇魚 豆蝦 菇豆")

    '------------------------------in1
    Input #1, N
    List1.Clear
    Call ABC("", N)
    Call check
    ans = 0
    For i = 0 To List1.ListCount - 1
    If List1.List(i) <> "" Then Print #3, List1.List(i): ans = ans + 1
    Next i
    Print #3, ans
    '------------------------------in2
    Print #3,
    Input #2, N
    List1.Clear
    Call ABC("", N)
    Call check
    ans = 0
    For i = 0 To List1.ListCount - 1
    If List1.List(i) <> "" Then Print #3, List1.List(i): ans = ans + 1
    Next i
    Print #3, ans


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

    Sub ABC(A, B)
    If Len(A) = B Then
    List1.AddItem A
    Else
    For i = 1 To B
    If InStr(A, X(i)) = 0 Then Call ABC(A & X(i), B)
    Next i
    End If
    End Sub

    Function check()
    P = True
    For j = 0 To List1.ListCount - 1
    For i = 0 To UBound(Y)
    If InStr(List1.List(j), Y(i)) <> 0 Then List1.List(j) = ""
    Next i
    Next j
    End Function

    回覆刪除
  2. Dim s, p, ans
    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
    s = Split("肉 菜 蛋 果 魚 蝦 豆 菇")

    Input #1, n
    Call A1(n, "")
    Call A2
    Print #3, ans
    Print #3, " "
    List1.Clear: ans = 0
    Input #2, n
    Call A1(n, "")
    Call A2
    Print #3, ans

    Close
    Close
    Close
    End
    End Sub


    '肉果 肉豆 肉菇 菜蛋 菜魚 菜豆 菜菇 蛋果 蛋蝦 蛋菇 果魚 果豆 果菇 魚蝦 魚豆 魚菇 蝦豆 豆菇
    Sub A1(a, b)
    If Len(b) = a Then
    List1.AddItem b
    Else
    For i = 0 To a - 1
    If InStr(b, s(i)) = 0 Then Call A1(a, b & s(i))
    Next
    End If
    End Sub

    Sub A2()

    p = Split("肉果 肉豆 肉菇 菜蛋 菜魚 菜豆 菜菇 蛋果 蛋蝦 蛋菇 果魚 果豆 果菇 魚蝦 魚豆 魚菇 蝦豆 豆菇 果肉 豆肉 菇肉 蛋菜 魚菜 豆菜 菇菜 果蛋 蝦蛋 菇蛋 魚果 豆果 菇果 蝦魚 豆魚 菇魚 豆蝦 菇豆")
    For i = 0 To List1.ListCount - 1
    k = List1.List(i)
    'MsgBox k
    For x = 0 To UBound(p)
    If InStr(k, p(x)) <> 0 Then List1.List(i) = "": Exit For
    Next
    If Len(Trim(List1.List(i))) <> 0 Then Print #3, List1.List(i): ans = ans + 1
    Next

    End Sub

    回覆刪除