1067 Bash遊戲 V2 博弈

2021-08-30 06:18:41 字數 1415 閱讀 6611

## **題目描述**: 有一堆石子共有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顆。...