POJ 2311 Cutting Game (Multi-Nim)
【题目链接】 http://poj.org/problem?id=2311
【题目大意】
给出一张n*m的纸,每次可以在一张纸上面切一刀将其分为两半
谁先切出1*1的小纸片谁就赢了,
【题解】
如果切出了一张1*n的纸条,那么下一步的人一定可以切出1*1的小纸片,
所以每次切只能切出长宽大于等于2的纸片,如果有人无法做到这一点就输了,
根据这种情况我们用记忆化搜索计算sg函数来得出答案.
【代码】
#include <cstdio> #include <set> #include <algorithm> #include <cstring> using namespace std; const int N=210; int sg[N][N]; int SG(int w,int h){ if(sg[w][h]!=-1)return sg[w][h]; set<int> s; for(int i=2;w-i>=2;i++)s.insert(SG(i,h)^SG(w-i,h)); for(int i=2;h-i>=2;i++)s.insert(SG(w,i)^SG(w,h-i)); int res=0; while(s.count(res))res++; return sg[w][h]=res; } int w,h; void solve(){ if(SG(w,h)!=0)puts("WIN"); else puts("LOSE"); } int main(){ memset(sg,-1,sizeof(sg)); while(~scanf("%d%d",&w,&h))solve(); return 0; }
愿你出走半生,归来仍是少年