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;
}
posted @ 2017-03-20 20:02  forever97  阅读(118)  评论(0编辑  收藏  举报