hdu 1536 | hdu 1944 - S-Nim(博弈-SG)
2013-10-28 22:00
423 查看
题目很啰嗦,说白了就是sg函数的简单运用,因为还没有理解sg函数的原理,只能先套用模板了~~
代码入下:(递归式)
代码如下:(非递归式)
代码入下:(递归式)
const int M = 10005; int n, sg[M], f[105]; int getSG(int x) { int &ans = sg[x]; if(ans!=-1) return ans; bool vis[110]; memset(vis,0,sizeof(vis)); for(int j = 0; f[j] <= x && j < n; ++j) vis[getSG(x-f[j])] = 1; for(int j = 0; ; ++j) { if(vis[j]==0) { ans = j; break; } } return ans; } int main() { int m, k, x; while(scanf("%d", &n) && n) { for(int i = 0; i < n; ++i) scanf("%d", &f[i]); sort(f,f+n); memset(sg,-1,sizeof(sg)); scanf("%d", &m); while(m--) { int ans = 0; scanf("%d", &k); while(k--) { scanf("%d", &x); ans ^= getSG(x); } if(ans) printf("W"); else printf("L"); } printf("\n"); } }
代码如下:(非递归式)
const int M = 10005; int n, sg[M], f[105]; void getSG() { sg[0] = 0; for(int i = 1; i < M; ++i) { bool vis[105]; memset(vis, 0, sizeof(vis)); for(int j = 0; f[j] <= i && j < n; ++j) vis[sg[i-f[j]]] = 1; for(int j = 0; ; ++j) if(!vis[j]) { sg[i] = j; break; } } } int main() { int m, k, x; while(scanf("%d", &n) && n) { for(int i = 0; i < n; ++i) scanf("%d", &f[i]); sort(f,f+n); getSG(); scanf("%d", &m); while(m--) { int ans = 0; scanf("%d", &k); while(k--) { scanf("%d", &x); ans ^= sg[x]; } if(ans) printf("W"); else printf("L"); } printf("\n"); } }
相关文章推荐
- hdu1536 & 1944 S-NIM 博弈 SG函数
- HDU 1536(sg博弈) S-Nim
- hdu 1536、hdu 1944 S-Nim(博弈SG函数)
- HDU 1536 S-Nim(SG经典博弈)
- HDU 1536 && HDU 1944 S-Nim (Nim博弈、SG函数模板)
- hdu 1536 S-Nim (sg)
- hdu 1536/ hdu 1944 S-Nim(sg函数)
- HDU 1536 与 1944 S-Nim
- [hdu 1536 S-Nim] SG 函数
- HDU 1536/1944 求SG值(走法不任意)
- hdu 1536 S-Nim (博弈)
- HDU 3032 Nim or not Nim?(博弈,SG打表找规律)
- HDU 1536 - S-Nim(SG)
- [ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
- [ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
- hdu 1536 S-Nim_求sg值模版
- HDU 3032 Nim or not Nim?(博弈 SG打表找规律)
- [ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
- hdu 1536 S-Nim_求sg值模版
- HDU(1536)S-Nim (博弈)