本文主要記錄和nim博弈,bash game的相關問題。題目:
hdu 2188 悼念512汶川大**遇難同胞——選拔志願者
hdu 2149 public sale
lightoj 1253 misere nim
lightoj 1247 matrix game
hdu 1517 a multiplication game
大意:二人捐款,每次捐款的錢數是1-m,誰先捐**到或大於n的人勝利
分析:數量狀態
勝利者1⟶m
grass
m+1rabbitm+
2⟶2m
+1grass
2m+2
rabbit2m
+3⟶3
m+2 grass
3m+3
rabbit
code:
#include
#include
using
namespace
std;
int main()
return
0;}
大意:兩個人**競爭一塊土地,每一次出錢有乙個限度。求解如果第乙個人勝利,他需要在第一次出的錢。
分析:如果第乙個人能夠保證差價剩下k*(m+1),那麼最後的競價次數一定能控制剛好等於k。
code:
#include
#include
using
namespace
std;
int main()
else }}
return
0;}
大意:和普通的nim遊戲相比這裡是先拿完物品的人輸。單純的討論必然思考各種複雜的情況,現在我們轉化它成一般性的nim遊戲。
nim game 誰先拿完誰就贏 最後的權利在我的手上,只要n>1,我就能剩下1,保證我贏。
如果全是1,那就依據單純的奇偶性判斷,奇數贏,偶數輸(全部針對先手而言)
code:
#include
#include
#include
#include
using
namespace
std; // vim game 誰先拿完誰就贏 最後的權利在我的手上,只要n>1,我就能剩下1
int main()
if(one==n)
if(ans==0) printf("case %d: bob\n",ca++);
else
printf("case %d: alice\n",ca++);
}return
0;}
大意:在乙個n×m的矩陣中每個格仔有一些石子。兩人玩遊戲,每乙個人一次可以選擇一行,任意取不少於1個石子,取完最後乙個石子的人贏。
分析:nim遊戲的簡單變形,只要將一行變成乙個數字就行。
code:
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
ll s[60];
int main()
ans=ans^s[i];
}if(ans) printf("case %d: alice\n",ca++);
else
printf("case %d: bob\n",ca++);
}return
0;}
範圍贏家
2–9s
9+1⟶
2*9o2*9+1
⟶ 2*9*9
s2*9*9+1
⟶ 2*9*9*2
o2*9*9*2+1
⟶ 2*9*9*2*9s
對於乙個給定的數字n可以直接由上表確定輸家和贏家。用浮點數!
code:
#include
#include
#include
#include
#include
using
namespace
std;
int main()
if(n<=9) puts("stan wins.");
else
puts("ollie wins.");
}return
0;}
關於這題記錄一次靈異事件:
對比:
Nim博弈與Anti Nim博弈
nim博弈的原題 問題1 今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根,可將一堆全取走,但不可不取,最後取完者為勝,求必勝的方法。定義 若所有火柴數異或為0,則該狀態被稱為利他態,用字母t表示 否則,為利己態,用s表示。注意 這篇博文是先定義s和t,再通過它們的性質推出結論。定理1...
博弈模板(bash,威佐夫,Nim)
寫一些博弈模板,借用51nod上的題目 bash遊戲 有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n和k,問最後誰能贏得比賽。include using namespace std int...
Nim遊戲與階梯Nim博弈
問題描述 一共有n堆石子,編號1 n,第i堆中有個a i 個石子。每一次操作alice和bob可以從任意一堆石子中取出任意數量的石子,至少取一顆,至多取出這一堆剩下的所有石子。兩個人輪流行動,取光所有石子的一方獲勝。aice為先手.給定a,假設兩人都採用最優策略,誰會獲勝?問題分析 從簡單情況分析,...