poj 2425 A Chess Game (DAG上博弈)
阿新 • • 發佈:2020-08-13
http://poj.org/problem?id=2425(記錄模板)
思路:dfs找對應起始位置的sg函式,看異或和是不是0。(具體看程式碼)
程式碼:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<sstream> #include<vector> #include<stack> #include<deque> #include<cmath> #include<map> #include<queue> #include<bitset> //#include<hash_map> #define sd(x) scanf("%d",&x) #define lsd(x) scanf("%lld",&x) #define ms(x,y) memset(x,y,sizeof x) #define fu(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define all(a) a.begin(),a.end() #define lson l,mid,rt<<1 #definerson mid+1,r,rt<<1|1 using namespace std; //using namespace __gnu_cxx; typedef long long ll; typedef unsigned long long ull; typedef long double ld; const int maxn=1e3+79; const int mod=998244353; const ll INF=0x7f7f7f7f; const double pi=acos(-1); int n,sg[maxn]; vector<int> to[maxn]; int dfs(intx) { if(sg[x]!=-1) return sg[x]; //這裡vis一定要開區域性,不然wa //因為每一層遞迴都要用不同的vis標記(雖然名字相同卻是不同陣列),放在全域性相當於所有迴圈共用一個vis bool vis[maxn];ms(vis,0); if(!to[x].empty()) fu(i,0,to[x].size()-1) { //搜尋他能到的點 int nxt=to[x][i]; dfs(nxt); vis[sg[nxt]]=1; } int i=0; while(vis[i]) i++;//找mex(sg[x]); return sg[x]=i; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); while(~sd(n)) { fu(i,0,n) to[i].clear(); ms(sg,-1); fu(i,0,n-1) { int x,y; sd(x); fu(j,1,x) { sd(y); to[i].push_back(y); } } int q; while(~sd(q)) { if(q==0) break; int ans=0; fu(i,1,q) { int pos;sd(pos); ans^=dfs(pos); } if(ans) printf("WIN\n"); else printf("LOSE\n"); } } return 0; }