zoukankan      html  css  js  c++  java
  • POJ 2311 Cutting Game(二维sg)

    链接:https://vjudge.net/problem/POJ-2311

    题意:给出一个N*M的纸片,每一次可以把一部分剪成两部分,谁剪出1*1的就赢了。

    题解:二维sg函数,每一个变量可以随便转但是都不会先剪出1*n或者n*1,这样就必败了,直接让状态的后继中最小的边是2即可

    dfs求sg

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int sg[205][205];
    int vis[520];
    
    int dfs_sg(int n, int m)
    {
        if(sg[n][m]!=-1) return sg[n][m];
        memset(vis, 0, sizeof(vis));
        for(int i=2; i<=n-i; i++)  //sg[1][k] 和 sg[k][1]=0, 所以都不会这样的后继状态
            vis[dfs_sg(i, m)^dfs_sg(n-i, m)]=1;
        for(int i=2; i<=m-i; i++)  //二维的sg有2个方向可以转
            vis[dfs_sg(n, i)^dfs_sg(n, m-i)]=1;
        for(int i=0; ; i++)
            if(!vis[i])
                return sg[n][m]=i;
    }
    
    int main()
    {
        //freopen("in.txt", "r", stdin);
        memset(sg, -1, sizeof(sg));
        int n, m;
        while(cin>>n>>m)
        {
            sg[1][1]=0;
            printf(dfs_sg(n,m)? "WIN
    ":"LOSE
    ");
        }
        return 0;
    }
    View Code

     递推求sg O(n^3)

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int sg[205][205];
    int vis[520];
    
    void calsg()
    {
        int n=205;
        for(int i=2; i<n; i++)
            for(int j=2; j<n; j++)
            {
                memset(vis, 0, sizeof(vis));
                for(int k=2; k<=i-2; k++)
                    vis[sg[k][j]^sg[i-k][j]]=1;
                for(int k=2; k<=j-2; k++)
                    vis[sg[i][k]^sg[i][j-k]]=1;
                for(int k=0; ; k++) 
                    if(!vis[k]) { 
                        sg[i][j]=k; break; 
                    }
            }
    }
    
    int main()
    {
        //freopen("in.txt", "r", stdin);
        calsg();
        int n, m;
        while(~scanf("%d%d", &n, &m))
        {
            printf(sg[n][m]? "WIN
    ":"LOSE
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    软件工程二人组队开发第一周
    软件工程第五周
    这学期的目标
    软件工程第四周的总结
    二维数组的最大子数组和 时间复杂度:O(n的四次方)
    10.tesseract
    mysql存储过程和函数
    mysql触发器
    9.selenium
    mysql练习
  • 原文地址:https://www.cnblogs.com/Yokel062/p/11688403.html
Copyright © 2011-2022 走看看