## **題目描述**: 有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次只能拿1,3,4顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽。 例如n = 2。a只能拿1顆,所以b可以拿到最後1顆石子。神奇的博弈論;
這個題就不是裸了,我們需要打出sg表,找出規律之後才可以做;關於sg的打表,看下面兩個部落格就可以學會啦!but:發現大牛的小問題,就是
這個 j <= n 我覺得有問題, 他可能會把自己的sg加入到s序列 導致最後的sg表不正確;
【例項】取石子問題
有1堆n個的石子,每次只能取個石子,先取完石子者勝利,那麼各個數的sg值為多少?
sg[0]=0,f=,
x=1 時,可以取走1 - f個石子,剩餘個,所以 sg1 = mex= mex = 1;
x=2 時,可以取走2 - f個石子,剩餘個,所以 sg2 = mex= mex = 0;
x=3 時,可以取走3 - f個石子,剩餘個,所以 sg3 = mex = mex =1;
x=4 時,可以取走4- f個石子,剩餘個,所以 sg[4] = mex = mex = 2;
x=5 時,可以取走5 - f個石子,剩餘個,所以sg[5] = mex =mex = 3;
以下是自己的延伸:
x=6時,可以取走6 - f個石子,剩餘個,所以sg[5] = mae = mex
終點來了,就是當x=7時會出現問題
x=7時,按原大牛的寫法可以取走 7 - f, 但是當 i == 7時, 兩個條件都滿足,會把 sg[7]也加進去, 導致sg[7]得到的不是正確的結果!
關於博弈論的學習blog:
1.博弈論及演算法實現
2.sg函式和sg定理【詳解】
我們先用sg函式打乙個0-100的表 看一下規律;
#include using namespace std;
#define n 3
#define max 1000
int f[n], sg[max], vis[max];
void init(int n)
for(int j = 0; ; j++)}}
}int main()
return 0;
}
結果是這樣:
可以看出 當 n % 7 == 0 || (n - 2) % 7 == 0 是 先手必敗 否則先手必勝;
#include using namespace std;
int main()
return 0;
}
51nod 1067 Bash遊戲 V2 博弈
1067 bash遊戲 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 收藏關注有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次只能拿1,3,4顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽。例...
51Nod 1067 Bash遊戲 V2 找規律
有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次只能拿1,3,4顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽。例如n 2。a只能拿1顆,所以b可以拿到最後1顆石子。收起第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 1000...
1185 威佐夫遊戲 V2
有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。例如 2堆石子分別為3顆和5顆。那麼不論a怎樣拿,b都有對應的方法拿到最後1顆。...