題意:
給你乙個n行20列的棋盤,棋盤裡面有些棋子,每個棋子每次只能往右走一步,如果右邊有棋子,可以跳過去,前提是最右邊有格仔,如果當前選手走到沒有棋子可以走了,那麼就算輸,問你先手是否會贏
題解:一看就知道是組合博弈的問題,關鍵在於如果求sg值,這裡要把一行看成乙個狀態,然後根據sg值的定義去求,如果不知道sg的求法,那去找度娘吧。預處理出一行所有狀態的sg,然後對每一行異或一下就行了。
#include#include#define f(i,a,b) for(int i=a;i<=b;i++)
int sg[1<<20];
void init(){
int end=(1<<20)-1;
f(i,0,end){
int last=-1,h[25],now=0;
memset(h,-1,sizeof(h));
f(j,0,19){//列舉下一步能達到的狀態
if(i<(1<>j)&1))last=j;
if(((i>>j)&1)&&~last)h[sg[i^(1<
2016多校聯賽 hdu 5724 Chess
此題就是乙個sg函式的題目,需要找出每一行的sg值,然後異或就可以咯。找sg需要在初始化的時候就找,也就是在t之前,暴力找出所有情況的sg。注意這個題只有20行,所以狀態壓縮一下就可以,每一行有棋子的地方就置為1,每一的地方就是0.include include include include in...
HDU 5724 Chess(狀態壓縮 組合博弈)
題目大意 一共n行20列,每行若干個棋子,對每個棋子,可以移動到右邊距離最近的空格。兩個人輪流移動,不能移動者輸,問先手是否可以勝利 解題思路 每行20格,我們可以把狀態壓縮到乙個int變數state裡,對於每乙個狀態,求出下乙個狀態做上標記,sg state 就是mex,也就是vis陣列中第乙個為...
hdu5996 hdu5724 階梯博弈
學習文章連線 hdu5724 題目連線 如下 不太懂 include include include include include include include include define ll long long using namespace std const int n 1003 in...