zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    c/c++指针数组和数组指针
    c/c++指针传参
    c/c++指针理解
    c/c++容器操作
    c/c++ 数组传参
    c/c++ 结构体传参问题
    c++ 创建对象的三种方法
    c/c++ 随机数生成
    c++预处理指令
    团队冲刺第二阶段01
  • 原文地址:https://www.cnblogs.com/forever97/p/poj2311.html
Copyright © 2011-2022 走看看