首页 > 其他分享 >Cutting Game

Cutting Game

时间:2023-07-15 11:46:36浏览次数:38  
标签:有向图 Game Cutting 矩形网格 include SG

题目来源:POJ2311 Cutting Game

题意

给定一张 \(N*M\) 的矩形网格纸,两名玩家轮流行动。在每一次行动中,可以任选一张矩形网格纸,沿着某一行或者某一列的格线,把它剪成两部分。首先剪出 \(1*1\) 的玩家获胜。两名玩家都采取最优策略行动,求先手是否必胜。

\[1 \leqslant N,M \leqslant 200 \]

Solution

可以任选一张矩形网格纸,显然是一个独立的有向图游戏。

考虑SG函数的构造方式,需要找出一个必败的局面作为有向图有向图的起点。

因为剪出 \(1 * 1\) 的获胜,那么显然根据最优策略原则,不会剪出 \(1 * X\) 的部分,那么必败局面为 \(2 * 2, 2 * 3, 3 * 3\) 。

对于一张独立的网格纸,其SG函数是固定的,可以通过记忆化来快速求解。

考虑如何计算 \(SG(N, M)\), 根据SG函数的定义:

\[SG(N, M) = mex(\{SG(i, M) \ \text{xor} \ SG(N - i, M)\} \cup \{SG(N, i) \ \text{xor} \ SG(N, M - i)\}) \]

通过记忆化搜索便可以求出答案,考虑总体时间复杂度为 \(O(n^3)\)

Code

点击查看代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <cmath>

using namespace std;

const int N = 250;
typedef long long lld;

inline int read() {
	register int w = 0, f = 1;
	register char c = getchar();
	while (c > '9' || c < '0') {
		if (c == '-')  f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		w = w * 10 + c - '0';
		c = getchar();
	}
	return w * f;
}

int n, m;

int sg[N][N];

inline int SG(register int x, register int y) {
	if (sg[x][y] != -1)  return sg[x][y];
	register bool f[N];
	memset(f, 0, sizeof (f));
	for (int i = 2; i <= x - i; ++i)  f[SG(i, y) ^ SG(x - i, y)] = 1;
	for (int i = 2; i <= y - i; ++i)  f[SG(x, i) ^ SG(x, y - i)] = 1;
	register int t = 0;
	while (f[t])  t++;
	return sg[x][y] = t;
}

int main() {
	memset(sg, -1, sizeof (sg));
	sg[2][2] = sg[2][3] = sg[3][2] = 0;
	while (~scanf("%d%d", &n, &m))  puts(SG(n, m) ? "WIN" : "LOSE");
	return 0;
}

标签:有向图,Game,Cutting,矩形网格,include,SG
From: https://www.cnblogs.com/abigjiong/p/17555844.html

相关文章

  • LWC 51:682. Baseball Game
    LWC51:682.BaseballGame传送门:682.BaseballGameProblem:You’renowabaseballgamepointrecorder.Givenalistofstrings,eachstringcanbeoneofthe4followingtypes:Integer(oneround’sscore):Directlyrepresentsthenumberofpointsyougetinthis......
  • LWC 50:679. 24 Game
    LWC50:679.24Game传送门:679.24GameProblem:Youhave4cardseachcontaininganumberfrom1to9.Youneedtojudgewhethertheycouldoperatedthrough*,/,+,-,(,)togetthevalueof24.Example1:Input:[4,1,8,7]Output:TrueExplanation:(8-4)......
  • CodeChef Cutting Plants难题题解
    STL-CodeChefCuttingPlants题解单调队列哦我要造福后人,因为题解太jb难找了题意:2个操作找一段l-r区间,取其<=最小值的任意高度,记为h将l-r变为h时间复杂度暂时归为n吧思路:(思路应该很容易跟上)最特殊的:L=R,来嘛我每个独自减那为什么会有-1呢涨不回去呗(bi>ai)现在关键在......
  • CF842E Nikita and game 题解
    题意一棵树初始只有一个编号为1的根结点。\(n\)次操作,每次新增一个点作为\(p_i\)的子结点,询问更新后有多少点可以作为树直径的端点。\(n\le3\times10^5\)。题解以下\(dist(x,y)\)表示点\(x\)与点\(y\)在树上的距离。不难发现若干条直径必然叠合于至少一点,任选这......
  • Building a Dice Game using JavaScript Javascript构建一个dice game 项目
    WewillbebuildingaDiceGameProjectusingHTML,CSS,andJavaScript.TheDiceGameisbasedonatwo-player.Bothplayersrollthediceandtheplayerwhogetsthehighestphasevaluewillwinthegame.ImagesofDicePhases: Thelistofdicephasesi......
  • CF1411G No Game No Life
    猜它是一个multi-sg,只用算出每个位置的sg值。不过注意到这是一个图,你要求mex肯定不会太大,毛咕咕一下不会超过\(\sqrt{m}\)。并且根据均摊,你求mex的复杂度是\(O(m)\)的。接下来相当于你有一个数\(v\)每次选一个点异或上它的sg值,求最后是\(0\)的概率。枚举这个过程......
  • xss漏洞攻击复现(xssgame靶场通关)
     这篇文章简单的介绍下xssgame的通关方法,从名字可以看出,xssgame就是针对xss攻击进行专门的漏洞复现,由易到难。 链接:https://pan.baidu.com/s/1F9I7iBdu7MPLLvegM5kAQg 提取码:469c 这是xssgame的安装包,将它放到phpstudy/WWW文件夹下访问即可 第一关 这一关没有任......
  • 关于游戏开发及Gamejam的一些尝试
    阅读笔记《01游戏设计》01游戏开发的意义文创意义1.时刻牢记,我们设计的终究是一款游戏,它首先需要对玩家的体验负责。所谓教育意义和弘扬文化只是在游戏体验完善的基础上,和题材风格叠加产生的效果。一开始就抱着“使命感”去设计游戏,反而不会制作出优秀的作品,只有优秀的游戏......
  • unreal engine 5.2 c++ 自定义gameplay
    1.新建c++工程2.打开worldsetting3.修改默认GamePlay4.依次新建对应GamePlay替换默认GamePlayDefaultPawnHUDPlayerControllerGameStatePlayerStateSpectatorPawn5.添加AhellogpGameModeBase默认构造函数#include"hellogpGameModeBase.h"#include......
  • Games101-Cp4-Geometry
    几何表示方法隐式表达对应通过隐函数表示点的相对位置,而不是空间的具体位置。具体有:代数公式、水平集、分形/自相似(fractals)、CSG(constructivesolidgeometry):通过简单几何体的布尔运算获得复杂的几何体、距离函数:指的是到几何体点的最小距离,当两个几何体的点近,通过融合距离函......