poj 2311 Cutting Game(sg函数)

原创 2012年03月26日 00:32:06

【题目大意】:给出一个n*m的矩阵,两个人轮流切割...直到一方不能切割为止,问先手的胜负情况


【解题思路】:原本看完题目觉得很简单,直接裸敲了个dfs~~结果无情的TLE...然后想想看看sg函数,然后发现貌似自己有点明白了。

                            这道题的关键在于把问题转化为nim博弈...换句话话说一切博弈皆nim...

                            设(n,k)为当前状态...则其后继状态可以为很多种,而我们将其均视为(n,k)的后继状态时,我们可以得到sg(n,k)=sg(a)^sg(b)....;(a,b设为其后继状态)...

                            因此...转化为nim博弈问题...


【代码】:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
                   
using namespace std;
                   
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long

ll dp[220][220];

ll dfs(int n,int k){
    int vis[220];
    int x,y;
    if (dp[n][k]!=-1) return dp[n][k];    
    memset(vis,0,sizeof(vis));
    for (int i=2; i<=k-2; i++){
        y=dfs(n,i)^dfs(n,k-i);
        vis[y]=1;
    }
    for (int i=2; i<=n-2; i++){
        x=dfs(i,k)^dfs(n-i,k);
        vis[x]=1;
    }
    int cnt=0;
    while (vis[cnt]) cnt++;
    dp[n][k]=cnt;
    return cnt;
}

int n,k;

int main() {
    memset(dp,-1,sizeof(dp));
    dp[2][2]=0;
    dp[2][3]=0;
    dp[3][2]=0;
    while (~scanf("%d%d",&n,&k)){
        ll tmp=dfs(n,k);
        if (tmp<=0) cout << "LOSE" << endl;
        else cout << "WIN" << endl;
    }
    return 0;
}


POJ2311——Cutting Game(sg函数)

Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3859   A...

POJ-2311 Cutting Game(SG函数,二维)

Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2750   A...

POJ2311 Cutting Game SG函数

题目链接:POJ2311 Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3850 ...

kyeremal-poj2311-Cutting Game-sg函数

poj2311-Cutting Game 题意:给定一张n*m的矩形纸片,定义一个决策为:从所有的纸片中任选一张(初始时仅有1张),沿平行于矩形边剪切,将原矩形分割为2个较小的矩形,双方轮流决策,先...

POJ 2311 Cutting Game【SG函数,子游戏终态】

题目链接:http://poj.org/problem?id=2311题意:给定一张纸,由w×h(2≤w,h≤200)w \times h(2 \le w,h \le 200)个方格组成,两个人轮流横...
  • Yukizzz
  • Yukizzz
  • 2016年07月30日 23:47
  • 602

POJ 2311 Cutting Game (sg博弈)

POJ 2311 Cutting Game 考虑每张纸的SG: 我们称当前纸可以切成的两张纸ai,bi为当前纸的子状态 那么当前纸的SG就是它所有子状态的异或和 而它的每一个子状态有2张纸,也...

poj2311 Cutting Game-----sg

Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2015   A...

POJ 2311 Cutting Game

2维的SG函数。。。2*2是必败状态

[POJ2311]Cutting Game(博弈)

ATP的老师【◇】搞了一坨考试题但是没有搞数据2333
  • FromATP
  • FromATP
  • 2016年11月08日 18:52
  • 142

POJ2311 Cutting Game (博弈)

Cutting GameTime Limit: 1000MS Memory Limit: 65536KDescriptionUrej loves to play various types of d...
  • a456052
  • a456052
  • 2015年07月28日 20:57
  • 209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2311 Cutting Game(sg函数)
举报原因:
原因补充:

(最多只允许输入30个字)