1. 程式人生 > >嘔心瀝血演算法題——取球博弈

嘔心瀝血演算法題——取球博弈

// 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,
// 也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。
// 我們約定:
// 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。
// 輪到某一方取球時不能棄權!
// A先取球,然後雙方交替取球,直到取完。
// 被迫拿到最後一個球的一方為負方(輸方)
// 請程式設計確定出在雙方都不判斷失誤的情況下,對於特定的初始球數,A是否能贏?


function contest() {
   if (n >= 1) {
      switch (n) {
         case 1: return false;  // 剩1個球,則輸
         case 3: return false;  // 剩3個球,則輸
         case 7: return false;  // 剩7個球,則輸
         case 8: return true;   // 剩8個球,則贏
         // 如果不是不是1,3,7,8則 選擇權交給B,B任然呼叫該函式,不過返回值需要取反   
         // 而此時A可以選的只有 1 3 7 8 所以用num減去之 逐個測試即可   
         default: return (!contest(n - 8) || !contest(n - 7) ||
            !contest(n - 3) || !contest(n - 1));
      }
   } else {
      return false;
   }
}