本文主要是介绍POJ - 2311 Cutting Game sg函数 二维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Q - Cutting Game
POJ - 2311
两个人在玩游戏。游戏规则如下:准备一张分成W x H的格子的长方形纸张,参与游戏的两个人轮流沿着格子的边界线切割纸张,水平或者垂直的奖纸张切割成两个部分。切割了n次之后就得到了n+1张纸,每次都选择切得的某一张纸再次进行切割。首先切出只有一个格子的纸张(1 x 1的各自组成的纸张)的一方获胜。
Input
输入包含多组测试样例。每组测试样例包含两个整数W和H(2 <= W, H <= 200),分别表示纸张的长和宽。
Output
对于每个测试样例输出一行:如果先手必胜输出"WIN",否则输出 "LOSE"。
Sample Input
2 2 3 2 4 2
Sample Output
LOSE LOSE WIN
直接暴力
这题好像有歧义
每次都选择切得的某一张纸再次进行切割
是选 上次切的两张纸中的一个 还是 以前全部切得的纸中的
这道题是后者
注意让强制没有1的状态转移、
从2开始转移
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int sg[206][206];
int flag[1005];
int main()
{int w,h;memset(sg,0,sizeof(sg));for(int i=2; i<=200; i++){for(int j=2; j<=200;j++){memset(flag,0,sizeof(flag));for(int k=2; k<=j-2; k++){flag[(sg[i][k]^sg[i][j-k])]++;}for(int k=2; k<=i-2; k++){flag[(sg[k][j]^sg[i-k][j])]++;}for(int k=0; k<1000; k++){if(!flag[k]){sg[i][j]=k;break;}}}}while(scanf("%d%d",&w,&h)!=EOF){if(sg[w][h])printf("WIN\n");else if(sg[w][h]==0)printf("LOSE\n");}}
这篇关于POJ - 2311 Cutting Game sg函数 二维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!