商科賽題目-排列組合後幾A幾B的判定

遊戲規則設定:數字個數為 2~6,為不同數字。 幾 A 幾 B 的判斷方式:『?A?B』,A 代表數值及位置都相同,B 表示只有數值相同但位置 不同。 例如 5234/5789,結果就是 1A0B,5 的數值及位置都對了,234 和 789 這三個數值都不相同。
 例如 5634/6589,結果就是 0A2B,5 和 6 的數值都對,但位置都不同。 例如 1847/6149,結果就是 1A1B。 例如 0234/0742,結果就是 1A2B。 例如 54321/01234,結果就是 0A4B。 例如 123678/023687,結果就是 3A2B。

在排列組合問題中將一組數字進行排列,可以得到不同的數字順序,例如 12 這個數的排列共 有:(1)12、(2)21 二組(由小到大排序);例如 123 這個數的排列組合順序為:(1)123、(2)132、 (3)213、(4)231、(5)312、(6)321 六組(由小到大排序);例如 1234 這數的排列組合有 24 組,數 列順序如下: (1)1234 (2)1243 (3)1324 (4)1342 (5)1423 (6)1432 (7)2134 (8)2143 (9)2314 (10)2341 (11)2413 (12)2431 (13)3124 (14)3142 (15)3214 (16)3241 (17)3412 (18)3421 (19)4123 (20)4132 (21)4213 (22)4231 (23)4312 (24)4321

輸入說明: 第一列的數字 n 代表有幾筆資料要測試, ,之後每列為每筆的測試資料,共有三 個正整數 。各個數字間以“,”隔開。i 的值為 其中之一,而 j 和 k 代表 i 值排列組合順序(由小到大排序)的第 j 個和第 k 個值。j 和 k 不會超出 i 的排列數,請 輸出第 j 個和第 k 個值的幾 A 幾 B。。 例如 這組測試資料中,12 這個數的排列組合有:(1)12、(2)21 二組(由小到大排 序),第 1 個值為 12;第 2 個值為 21;幾 A 幾 B 為 0A2B。 例如 這組測試資料中,123 這個數的排列組合有:(1)123、(2)132、(3)213、(4)231、 (5)312、(6)321 六組(由小到大排序),第 1 個值為 123;第 2 個值為 132;幾 A 幾 B 為 1A2B。
 例如 這組測試資料中,123 這個數的排列組合有:(1)123、(2)132、(3)213、(4)231、 (5)312、(6)321 六組(由小到大排序),第 2 個值為 132;第 5 個值為 312;幾 A 幾 B 為 1A2B。
 例如 這組測試資料中,1234 這個數的排列組合有 24 組(由小到大排序),第 15 個值為 3214;第 9 個值為 2314;幾 A 幾 B 為 2A2B。 例如 這組測試資料中,1234 這個數的排列組合有 24 組(由小到大排序),第 3 個值為 1324;第 4 個值為 1342;幾 A 幾 B 為 2A2B。


輸出說明: 每組測試資料輸出一列。輸出以 i 值排列組合順序中,找出第 j 個和第 k 個的值,再算出個這 二個值的幾 A 幾 B。對於每組資料,輸出『?A?B』,A 代表數值及位置都相同,B 表示數 值相同但位置不同。

輸入檔案 1:【檔名:in1.txt】 3 12,1,2 123,1,2 123,2,5

輸入檔案 2:【檔名:in2.txt】 4 1234,15,9 1234,3,4 1234,1,24 1234,1,1

輸出範例:【檔名:out.txt】 0A2B 1A2B 1A2B

2A2B 2A2B 0A4B 4A0B

解題流程:
排列組合1-3 1-4 1-5的不同排列
Sub arrange(ByVal layers, ByVal digits, ByVal s)
        If layers = digits Then
            Dim r = norepeat(s)
            If r = "yes" Then
                ans = ans & s & "/"
            End If
        Else
            For i = 1 To digits
                arrange(layers + 1, digits, s & i)
            Next
        End If

    End Sub
檢查没有重複數字的排列才合格
Function norepeat(ByVal s)
        Dim t = "yes"
        Dim lg = Len(s)
        For i = 1 To lg
            Dim a = Mid(s, i, 1)
            Dim b = InStr(i + 1, s, a)
            If b <> 0 Then
                t = "no"
                Return t
                Exit Function
            End If
        Next
        Return t
    End Function
得到如下組合


Dim sarray = Split(ans, "/")
        Array.Sort(sarray)  '排序由小到大
        Dim Aa = 0
        Dim Ba = 0
        For M = 1 To Len(sarray(i))
            Dim a1 = Mid(sarray(i), M, 1)'取出每一數字跟另一數字比較
            For K = 1 To Len(sarray(j))
                Dim b1 = Mid(sarray(j), K, 1)
                If M = K And a1 = b1 Then ' M K分別代表位置 a1 b1代表內容數字
                    Aa += 1
                Else
                    If a1 = b1 Then
                        Ba += 1
                    End If
                End If
            Next
        Next
        Dim anst = Aa & "A" & Ba & "B"





留言

這個網誌中的熱門文章

今彩 539 6取5包牌-比對中獎號碼