CF138D World of Darkraft
$ \color{#0066ff}{ 题目描述 }$
n*m的格子,每个格子有字符'L','R',X',初始可以选择所有格子.
当选了 'L'的格子时,当前格子左下右上这条线上所有点不能选;
当选了 'R'的格子时,当前格子右下左上这条线上所有点不能选;
当选了 'X'的格子时,就是相当于同时选了'L','R';
如果不是最后选的输出'WIN',否则输出'LOSE'
\(\color{#0066ff}{输入格式}\)
第一行两个正整数 \(n,m\) 表示网格大小
接下来是格子
\(\color{#0066ff}{输出格式}\)
如果不是最后选的输出'WIN',否则输出'LOSE'
\(\color{#0066ff}{输入样例}\)
2 2
RL
LR
2 2
RR
RR
\(\color{#0066ff}{输出样例}\)
LOSE
WIN
\(\color{#0066ff}{数据范围与提示}\)
1<=n,m<=20
\(\color{#0066ff}{题解}\)
对于对角线的切割,我们不好处理,考虑旋转坐标系
然后,方格就形成了一个菱形,每次我们或横切或纵切,或者一起
然后发现,对这个菱形黑白染色,黑和白是不会互相影响的!于是我们就分成了2个游戏
我用坐标范围来表示当前的状态,每次枚举所有格子,转移到两个或四个游戏,异或起来作为后继状态
直接SG定理即可
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 55;
int n, m;
int sg[maxn][maxn][maxn][maxn][2];
char mp[maxn][maxn];
bool vis[1002020];
int work(int xmin, int xmax, int ymin, int ymax, int tp) {
if(xmin > xmax || ymin > ymax) return 0;
int &now = sg[xmin][xmax][ymin][ymax][tp];
if(~now) return now;
now = 0;
for(int x = 1; x <= n; x++)
for(int y = 1; y <= m; y++)
if(((x + y) & 1) == tp) {
int xx = x + y, yy = x - y + m;
if(xmin <= xx && xx < xmax && ymin <= yy && yy < ymax) {
if(mp[x][y] == 'L') work(xmin, xx, ymin, ymax, tp), work(xx + 1, xmax, ymin, ymax, tp);
if(mp[x][y] == 'R') work(xmin, xmax, ymin, yy, tp), work(xmin, xmax, yy + 1, ymax, tp);
if(mp[x][y] == 'X') work(xmin, xx, ymin, yy, tp), work(xmin, xx, yy + 1, ymax, tp),
work(xx + 1, xmax, ymin, yy, tp), work(xx + 1, xmax, yy + 1, ymax, tp);
}
}
for(int x = 1; x <= n; x++)
for(int y = 1; y <= m; y++)
if(((x + y) & 1) == tp) {
int xx = x + y, yy = x - y + m;
if(xmin <= xx && xx < xmax && ymin <= yy && yy < ymax) {
if(mp[x][y] == 'L') vis[sg[xmin][xx][ymin][ymax][tp] ^ sg[xx + 1][xmax][ymin][ymax][tp]] = true;
if(mp[x][y] == 'R') vis[sg[xmin][xmax][ymin][yy][tp] ^ sg[xmin][xmax][yy + 1][ymax][tp]] = true;
if(mp[x][y] == 'X') vis[sg[xmin][xx][ymin][yy][tp] ^ sg[xmin][xx][yy + 1][ymax][tp] ^
sg[xx + 1][xmax][ymin][yy][tp] ^ sg[xx + 1][xmax][yy + 1][ymax][tp]] = true;
}
}
while(vis[now]) now++;
for(int x = 1; x <= n; x++)
for(int y = 1; y <= m; y++)
if(((x + y) & 1) == tp) {
int xx = x + y, yy = x - y + m;
if(xmin <= xx && xx < xmax && ymin <= yy && yy < ymax) {
if(mp[x][y] == 'L') vis[sg[xmin][xx][ymin][ymax][tp] ^ sg[xx + 1][xmax][ymin][ymax][tp]] = false;
if(mp[x][y] == 'R') vis[sg[xmin][xmax][ymin][yy][tp] ^ sg[xmin][xmax][yy + 1][ymax][tp]] = false;
if(mp[x][y] == 'X') vis[sg[xmin][xx][ymin][yy][tp] ^ sg[xmin][xx][yy + 1][ymax][tp] ^
sg[xx + 1][xmax][ymin][yy][tp] ^ sg[xx + 1][xmax][yy + 1][ymax][tp]] = false;
}
}
return now;
}
char getch() {
char ch;
while(!isalpha(ch = getchar()));
return ch;
}
int main() {
n = in(), m = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
mp[i][j] = getch();
memset(sg, -1, sizeof sg);
puts(work(2, n + m + 3, 1, n + m + 3, 0) ^ work(1, n + m + 3, 1, n + m + 3, 1)? "WIN" : "LOSE");
return 0;
}
CF138D World of Darkraft的更多相关文章
- [codeforces464D]World of Darkraft - 2 概率期望
D. World of Darkraft - 2 time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- CF464D World of Darkraft - 2
Roma 在游戏"World of Darkraft"(理论上应该是 World of darkcraft,MineCraft 的一个版本)找到一个新角色. \(\mathrm{R ...
- Codeforces 138D World of Darkraft
有一个n*m 的棋盘,每个点上标记了L,R,X 中的一个每次能选择一个没有被攻击过的点(i,j),从这个点开始发射线,射线形状为:1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来2. ...
- 【Codeforces 464D】World of Darkraft - 2
Codeforces 464 D 首先我们知道这K个装备是互不干扰的,就是说如果一个装备升级了或者卖掉了,不会对其它装备的挣到的钱产生任何影响.所以我们就考虑单独处理某一个装备挣到的钱. 那么就设\( ...
- Codeforces 464D-World of Darkraft - 2
题意 有 \(n\) 个怪兽,\(k\) 种装备.最开始每个装备的等级都是 1 .每打完一个怪兽就会随机掉落一个装备. 随机的方式是,先等概率随机一个装备种类,设当前这个装备的等级为 \(t\) ,那 ...
- Codeforces 138D World of Darkraft(Multi-Nim)
[题目链接] http://codeforces.com/problemset/problem/138/D [题目大意] H*W的棋盘中每个点都是L.R.X三者之一,两人轮流选一个点, 若为L则向左下 ...
- World of Darkraft(codeforces 138D)
题意:有一个 n × m 的棋盘,每个点上标记了 L; R; X 中的一个 每次能选择一个没有被攻击过的点 (i; j),从这个点开始发射线,射线形状为: 1. 若字符是 L,向左下角和右上角发,遇到 ...
- Codeforces 1321E World of Darkraft: Battle for Azathoth
题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...
- CF1320C World of Darkraft: Battle for Azathoth
线段树 又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫 CF1295E 可以发现可以打败怪兽的关系类似二维偏序 那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序 把所有的怪兽以防御 ...
随机推荐
- .NET 调用c++库注意事项
很久没有更新了,主要还是因为自己懒吧,希望从今天开始坚持至少一周写一篇文章. 调用函数库是正常的,调用完成后,在使用EF进行数据更新时,将发生如下异常信息,而且几乎必现. 行库遇到了错误.此错误的地址 ...
- MySQL中TRUNCATE和ROUND函数的用法
一.TRUNCATE(expr, int_expr)用法 TRUNCATE函数将expr按照int_expr长度在小数点后按照位数直接进行截取. 实例: ); 输出结果:200.1256 二.ROUN ...
- bash shell笔记6 脚本控制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/522415 知 ...
- 斯坦福CS229机器学习课程笔记 part2:分类和逻辑回归 Classificatiion and logistic regression
Logistic Regression 逻辑回归 1.模型 逻辑回归解决的是分类问题,并且是二元分类问题(binary classification),y只有0,1两个取值.对于分类问题使用线性回归不 ...
- java定时任务实现的几种方式(Timer、Spring Task、Quartz)
Timer JDK自带的Timer类,允许调度一个TimerTask任务. Demo: /** * Timer测试类 */ public class TimerDemo { public static ...
- Linux 下Nginx 运行Vue
首相基础的安装Node.js npm 先建个目录把 /node/www 然后在这个目录下 wget https://nodejs.org/dist/v8.11.1/node-v8.11.1-linu ...
- EF删除,查询,Linq查询,Lambda查询,修改链接字符串
(1)//删除操作 public bool delete() { try { a_context = new AEntities(); b1 = new Table_1(); //删除只需要写主键就行 ...
- 360 安全卫士 for Linux 使用结果
测试了一把,结果显示360基本对Linux社区规范和安全常识不give a fuck. 胡乱打包 首先,这个deb包就是胡乱打包,依赖关系就没弄好: $ dpkg-deb -I 360safeforl ...
- Luogu 4844 LJJ爱数数
LOJ 6482 设$d = gcd(a, b)$,$xd = a$,$yd = b$,因为$\frac{1}{a} + \frac{1}{b} = \frac{a + b}{ab} = \frac{ ...
- Django rest_framework----序列化组件
生成hypermedialink serializer.pclass BookModelSerializers(serializers.ModelSerializer): class Meta: mo ...