2013\National _C_C++_A\2.骰子迷题
生活随笔
收集整理的這篇文章主要介紹了
2013\National _C_C++_A\2.骰子迷题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小明參加了少年宮的一項趣味活動:每個小朋友發給一個空白的骰子(它的6個面是空白的,沒有數字),要小朋友自己設計每個面寫哪個數字。但有如下要求:
每個面只能填寫 0 至 8 中的某一個數字。
不同面可以填寫同樣的數字,但6個面總和必須等于24。
填好后,小朋友可以用自己填寫好數字的骰子向少年宮的兩個機器人挑戰----玩擲骰子游戲。規則如下:
三方同時擲出自己的骰子,如果出現任何相同的數字,則三方都不計分。
如果三方數字都不同,則最小數字一方扣 1 分,最大數字一方加 1 分。
小明看到了兩個機器人手中的骰子分別是:
0 0 0 8 8 8
1 1 4 5 6 7
請你替小明算一下,他如何填寫,才能使自己得分的概率最大。
請提交小明應該填寫的6個數字,按升序排列,數字間用一個空格分開。
如果認為有多個答案,提交字母序最小的那個方案。
請嚴格按照格式,通過瀏覽器提交答案。
注意:只提交一行內容,含有6個被空格分開的數字。不要寫其它附加內容,比如:說明性的文字。
DFS
Code
def calculateProbability():"""計算獲勝概率"""global ans, maxInfx1, x2, m = 0, 0, 0for i in range(6):x1, x2 = 0, 0for j in range(6):if ans[i] > a[j]:x1 += 1else:breakfor j in range(6):if ans[i] > b[j]:x2 += 1else:breakm += x1 + x2if m > maxInf:maxInf = mprint(ans)def dfs(n: int, c: int, s: int):"""n: 骰子的六個面c: 當前面的點數s: 當前點數之和"""if s > 24:returnif n == 6:if s == 24:calculateProbability()returnfor i in range(c, 9):# 剪枝,如果剩下的所有面全部用 8 點能夠滿足點數之和的需求if (5 - n) * 8 >= 24 - s - i:ans[n] = idfs(n + 1, i, s + i)ans[n] = 0if __name__ == '__main__':a, b = [0, 0, 0, 8, 8, 8], [1, 1, 4, 5, 6, 7]ans, maxInf = [0] * 6, 0dfs(0, 0, 0)Answer:2 2 2 2 8 8
總結
以上是生活随笔為你收集整理的2013\National _C_C++_A\2.骰子迷题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2013\National _C_C++
- 下一篇: 2013\National _C_C++