寫一些博弈模板,借用51nod上的題目:
bash遊戲:
有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n和k,問最後誰能贏得比賽。
#include using namespace std;
int main()
}return 0;
}
bash遊戲v2:
有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次只能拿1,3,4顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽。
#include using namespace std;
int main()
return 0;
}
bashv3:
有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次拿的數量只能是2的正整數次冪,比如(1,2,4,8,16....),拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽
#include using namespace std;
char s[1005];
int main()
}if(sign)
printf("a\n");
else
printf("b\n");
}return 0;
}
威佐夫遊戲(精度控制):
有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。
#include #include using namespace std;
typedef unsigned long long ull;
const ull gold[3] = ;
const ull mod = 1000000000;
int main()
ull dist = a - b;
ull pre = dist / mod, las = dist % mod;
ull a1 = las * gold[2];
ull a2 = pre * gold[2] + las * gold[1] + a1 / mod;
ull a3 = pre * gold[1] + las * gold[0] + a2 / mod;
ull a4 = dist + pre * gold[0] + a3 / mod;
cout << (a4 == b ? 'b' : 'a') << endl;
}}
nim遊戲:
有n堆石子。a b兩個人輪流拿,a先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n及每堆石子的數量,問最後誰能贏得比賽。
#include using namespace std;
int main()
if(ans==0)
printf("b\n");
else
printf("a\n");
}
1072 威佐夫遊戲 威佐夫博弈模板
wythoff game 分割 先取完者贏 威佐夫博弈 每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取 乙個局面,讓你求是先手輸贏 差值 1.618 最小值的話後手贏,否則先手贏 乙個局面,讓你求先手輸贏,假設先手贏的話輸出他第一次的取法 首先討論在兩邊同時取的情況,很明顯兩邊同時取...
博弈 威佐夫博弈
有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光著得勝。奇異局勢的性質 1.任何自然數都包含在乙個且僅有乙個奇異局勢中 2.任何操作都可以將奇異局勢變為非奇異局勢 3.採用適當的方法,可以將非奇異局勢變為奇異局勢。所以面對非奇異局勢,先手必勝...
威佐夫博弈
威佐夫博奕 wythoff game 有兩堆各若干個物品,兩個人輪流從某一堆或同 時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。這種情況下是頗為複雜的。我們用 ak,bk ak bk k 0,1,2,n 表示 兩堆物品的數量並稱其為局勢,如果甲面對 0,0 那麼甲已經輸了,...