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;
}
愿你出走半生,归来仍是少年

浙公网安备 33010602011771号