首先輸入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時,...