传送门

Luogu

解题思路

爆搜,并考虑几个剪枝。

  • 不交换颜色相同的方块(有争议,但是可以过联赛数据 \(Q \omega Q\))
  • 左边为空才往左换
  • 右边不为空才往右换

因为对于两个相邻方块,右边往左换和左边往右换是等价的,同时还可以保证字典序最小。

细节注意事项

  • 爆搜题,你们懂的。。。

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
} int n, a[10][10], la[10][10][10], ans[10][10], mark[10][10]; inline bool remv() {
int flag = 0;
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 7; ++j)
if (a[i][j]) {
if (i > 1 && i < 5 && a[i][j] == a[i - 1][j] && a[i][j] == a[i + 1][j])
flag = 1, mark[i][j] = mark[i - 1][j] = mark[i + 1][j] = 1;
if (j > 1 && j < 7 && a[i][j] == a[i][j - 1] && a[i][j] == a[i][j + 1])
flag = 1, mark[i][j] = mark[i][j - 1] = mark[i][j + 1] = 1;
}
if (!flag) return 0;
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 7; ++j)
if (mark[i][j])
mark[i][j] = 0, a[i][j] = 0;
return 1;
} inline void upt() {
for (rg int i = 1; i <= 5; ++i) {
int s = 0;
for (rg int j = 1; j <= 7; ++j) {
if (!a[i][j]) ++s;
else if (s) a[i][j - s] = a[i][j], a[i][j] = 0;
}
}
} inline void mv(int i, int j, int t) {
swap(a[i][j], a[i + t][j]);
do { upt(); } while (remv());
} inline bool check() {
for (rg int i = 1; i <= 5; ++i)
if (a[i][1]) return 0;
return 1;
} inline void dfs(int x) {
if (check()) {
for (rg int i = 1; i < x; ++i)
printf("%d %d %d\n", ans[0][i], ans[1][i], ans[2][i]);
exit(0);
}
if (x > n) return;
memcpy(la[x], a, sizeof a);
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 7; ++j)
if (a[i][j]) {
if (i < 5 && a[i + 1][j] != a[i][j]) {
mv(i, j, 1);
ans[0][x] = i - 1, ans[1][x] = j - 1, ans[2][x] = 1;
dfs(x + 1);
memcpy(a, la[x], sizeof la[x]);
ans[0][x] = 0, ans[1][x] = 0, ans[2][x] = 0;
}
if (i > 1 && a[i - 1][j] == 0) {
mv(i, j, -1);
ans[0][x] = i - 1, ans[1][x] = j - 1, ans[2][x] = -1;
dfs(x + 1);
memcpy(a, la[x], sizeof la[x]);
ans[0][x] = 0, ans[1][x] = 0, ans[2][x] = 0;
}
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
read(n);
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 8; ++j) {
read(a[i][j]); if (a[i][j] == 0) break;
}
dfs(1);
puts("-1");
return 0;
}

完结撒花 \(qwq\)

「NOIP2011」Mayan游戏的更多相关文章

  1. 一本通1648【例 1】「NOIP2011」计算系数

    1648: [例 1]「NOIP2011」计算系数 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 给定一个多项式 (ax+by)k ,请求出多项式展开后 x ...

  2. 【noip2011】Mayan游戏

    题解: 刷了一天的noip啊 做了10题! 突然找回了做马拉松的感觉- - 我中午竟然放弃治疗去看视频 做到晚上累得都快挂了 用电脑放一些rock 把音乐当咖啡硬撑下来 但是还是没能刷3届 唉 显然速 ...

  3. 「Githug」Git 游戏通关流程

    Githug 他喵的这是个啥!?难道不是 GitHub 拼错了么,和 Git 什么关系? 和游戏又有什么关系? 其实,他的元身在这里:https://github.com/Gazler/githug  ...

  4. 【LOJ】#2067. 「SDOI2016」硬币游戏

    题解 c一样的就是一个独立的游戏 我们对于2和3的指数 sg[i][j] 表示\(c \cdot 2^i \cdot 3^j\)的棋子,只有这个硬币是反面,翻转的硬币是正面的sg值 枚举sg函数所有可 ...

  5. @loj - 2004@ 「SDOI2017」硬币游戏

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数 ...

  6. 题解 「HDU6403」卡片游戏

    link Description 桌面上摊开着一些卡牌,这是她平时很爱玩的一个游戏.如今卡牌还在,她却不在我身边.不知不觉,我翻开了卡牌,回忆起了当时一起玩卡牌的那段时间. 每张卡牌的正面与反面都各有 ...

  7. 题解 「SDOI2017」硬币游戏

    题目传送门 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强 ...

  8. 【LOJ 2004】「SDOI2017」硬币游戏

    LOJ 2004 100pts 首先我们肯定要建AC自动机的.. 那么这题就肯定是个AC自动机上\(dp\). 所以想想状态. 首先如果我们把状态设成这样行不行: \(dp(i)\)表示匹配到了i节点 ...

  9. 【LOJ】#2182. 「SDOI2015」寻宝游戏

    题解 终于了解怎么动态维护虚树了 就是把点按照dfs序排个序啊 这道题显然是求虚树上所有边长的两倍 我们把dfs序排完序,相邻两个点加上路径长(包括首尾),删除的时候删一个点减去它到两边再加上新近相邻 ...

随机推荐

  1. Jmeter和nmon shell命令

    jmeter: sh jmeter -n -t /data/LPPZ/scripts/oauth.jmx -l /data/LPPZ/log/log.jtl nmon: ./nmon_linux_x8 ...

  2. EAP认证

    EAP信息交换: 上图中展示的是OTP(一次性密码)实现EAP交换过程,具体的EAP交换过程如下: 步骤1:请求方向认证方发送EAPOL-Start消息,通知对方已经做到了认证准备(注意:若会话由认证 ...

  3. 【原】tcp三次握手和四次挥手

  4. .hpp 文件

    .hpp 是 Header Plus Plus 的简写,是 C++程序头文件. 其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp ...

  5. Mockito 中文文档 ( 2.0.26 beta )

    Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ...

  6. color转成image对象

    .h //颜色转换成图片 + (UIImage *)imageFromColor:(UIColor *)color; .m //颜色转换成图片 + (UIImage *)imageFromColor: ...

  7. 【规范建议】服务端接口返回字段类型与iOS端的解析

    一.本文档的写作目的 App需要跟产品.UI.后台.服务器.测试打交道,app的产出是其他端人员产出的综合体现.与其他端人员沟通就像是开发写接口,也就是面向接口编程的思想. 本文档讲解针对的是服务端返 ...

  8. Django中的prefetch_related()函数优化

    对于多对多字段(ManyToManyField)和一对多字段, 可以使用prefetch_related()来进行优化 prefetch_related()和select_related()的设计目的 ...

  9. GO常量/枚举

    常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifier [type] = value 你可以省略类型说明符 [type],因为编 ...

  10. JS原型链的理解和使用(一)

    一些个人的理解,不一定是对的,仅供参考. 在JS中有函数和对象两个概念,而又有一切皆对象的概念及函数也是一个对象.所以可以说函数一定可以作为一个对象,而对象不一定是一个函数. 也可以说在js中对象分为 ...