S Nim HDU 1536 博弈 sg函式

2022-03-16 22:17:26 字數 1082 閱讀 3802

首先輸入k,表示乙個集合的大小,之後輸入集合,表示對於這對石子只能去這個集合中的元素的個數,之後輸入 乙個m表示接下來對於這個集合要進行m次詢問,之後m行,每行輸入乙個n表示有n個堆,每堆有n1個石子,問這一行所表示的狀態是贏還是輸,如果贏輸入w否則l。

如果沒有每次取石子個數的限制的話,那麼僅僅需要把每堆石子的個數進行異或運算即可,如果結果不是1,那麼先手贏,反之後手贏。

但是這裡對每次取石子的個數進行了限制,每次只能從幾個數中進行選擇,這是就需要sg函式來進行處理了。至於為什麼要使用sg函式來進行處理這裡沒有寫,詳細可以參考這個部落格博弈論 sg函式

這裡僅僅寫了sg函式的兩種寫法:1是打表法,2是dfs法。

//打表法實現

#include#include#includeusing namespace std;

const int maxn=1e4+7;

int sg[maxn];

bool book[maxn];//這個需要用bool型別,如果改成int型別會超時,第一次遇到。

int s[107];

int k, m, l;

void getsg(int n, int k)//n代表這堆石子最多有多少,k代表有多少種取的模式 }}

int main()

if(ans==0)

printf("l");

else

printf("w");

} printf("\n");

} return 0;

}

#include#include#includeusing namespace std;

const int maxn=10050+7;

int s[105];

int sg[maxn];

int k, m, l;

int sg(int x)

int main()

if(ans==0) printf("l");

else printf("w");

} printf("\n");

} return 0;

}

hdu 1536 博弈SG函式

1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 10using namespace std 1112 const int max 109 13 int num max sg max 1...

HDU 1536 SG函式應用

只要構造好sg函式 就行 ac includeusing namespace std include int a 110 k k為全域性變數 int sg 10010 flag 110 void sg sg函式 int main if s cout w else cout l cout return...

博弈sg函式

sg函式 個人認為還是用於三種方法都無法解決的情況,如按特殊數字取石子 我們把整個博弈過程抽象為有向無環圖 1.幾項準備工作 mex求最小非負整數mex 0,mex 3,mex 0 sg x mex 就是石頭變少的繼 這樣sg就滿足幾個性質 1.sg x 0時,它的後繼都不為零 2.sg x 0時,...