在乙個2*n的格仔上,alice和bob又開始了新遊戲之旅。
這些格仔中的一些已經被塗過色,alice和bob輪流在這些格仔裡進行塗色操作,使用兩種塗色工具,第一種可以塗色任意乙個格仔,第二種可以塗色任意乙個2*2的格仔。每一輪遊戲裡,他們可以選擇一種工具來塗色gshpan尚未被染色的格仔。需要注意,塗色2*2的格仔時,4個格仔都應當未被塗色。最後一步塗滿所有格仔的玩家獲勝。&ngshpanbsp;
一如既往,alice先手,最優策略,誰是贏家?
input輸入第一行為t,表示有t組測試資料。
每組資料報含兩個數字,n與m,m表示有多少個已被染色的格仔。接下來的m行每行有兩個數字xi與yi,表示已經被塗色的格仔座標。
[technical specification]
1. 1 <= t <= 74
2. 1 <= n <= 4747
3. 0 <= m <= 2 * n
4. 1 <= xi <= 2, 1 <= yi <= n,格仔座標不會重複出現
output對每組資料,先輸出為第幾組資料,然後輸出「alice」或者「bob」,表示這輪遊戲的贏家。 sample input
22 0
2 21 1
2 2sample output
case 1: alice
case 2: bob
思路:可以先考慮有連續n列的空格的sg值是多少。
n=0時顯然sg[0]=0,之後就是普通的sg函式打表,只不過是要將格仔分割槽而已。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf www.cppcns.com0x3f3f3f3f
#pragma comment(linker, "/stack:102400000,102400000")
using namespace std;
const int maxn=5000;
int sg[maxn];
bool pl[2][maxn];
int get_sg(int x)
for(int i=0; i<=x-2-i; i++)
for(int i=0; ; i++) }
return sg[x];
}int main()
if(pl[0][i]^pl[1][i]) //如果這一列之塗了乙個格仔,那麼異或這一列格仔之前的連續空格子的sg值再異或1
cnt++; //如果這一列沒有格仔被塗,那麼連續空格子的長度+1
} ans^=sg[cnt];
if(ans)
printf("case %d: alice\n", cas);
else
printf("case %d: bob\n", cas);
} return 0;
}本文標題: c++實現塗色遊戲(博弈)
本文位址:
博弈 塗色遊戲
在乙個2 n的格仔上,alice和bob又開始了新遊戲之旅。這些格仔中的一些已經被塗過色,alice和bob輪流在這些格仔裡進行塗色操作,使用兩種塗色工具,第一種可以塗色任意乙個格仔,第二種可以塗色任意乙個2 2的格仔。每一輪遊戲裡,他們可以選擇一種工具來塗色尚未被染色的格仔。需要注意,塗色2 2的...
組合遊戲(博弈)
昨天看大白書翻到了組合遊戲這章,看著發覺原來是博弈論的內容,於是便看下去了。真是不看不知道,一看才知道自己的水平有多弱,不過好在還是集中精神地看了大部分。從nim遊戲 n堆石子,每人每次可以從任意一堆中取至少1個 至多整堆的石子,不能取者為輸 開始講起,引入必勝態 必敗態的概念 1.乙個狀態是必敗狀...
博弈遊戲(Bash Nim wythoff)
bash game nim game 和 wythoff game,較為領人驚嘆的是,他們最後都是通過數論或者自然數性質完美解決 bash game 同餘理論 nim game 異或理論 wythoff game 分割 一堆n個物品,兩人輪流取,每次取1至m個,最後取完者勝,比如10個物品,每次只能...