传送门

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. hive3.1.1 hive-site.xml

    <property> <name>hive.metastore.warehouse.dir</name> <value>/data/hive/wareh ...

  2. 【C#】图解如何添加引用using MySql.Data.MySqlClient;

    使用C#连接MySQL时,经常会用到命名空间using MySql.Data.MySqlClient; 这说明VS中没有添加引用,解决方法如下: 1,可点击以下两个链接的其中任何一个,下载MySQL. ...

  3. 解决Vue 使用vue-router切换页面时 页面显示没有在顶部的问题

    有时候我们需要页面滚动条滚动到某一固定的位置,一般使用Window scrollTo() 方法. 语法就是:scrollTo(xpos,ypos) xpos:必需.要在窗口文档显示区左上角显示的文档的 ...

  4. 一个含有Zeta函数的级数

    \[\Large\sum_{k=1}^{\infty}\frac{(2^{2k-1}-2)(4^{2k+1}-3^{2k+1})}{144^k\,k\,(2k+1)}\zeta(2k)\] \(\La ...

  5. Golang介绍以及安装

    Go语言 Google开源 编译形语言 21世纪的C语言 Go语言的特点 简单易并发 开发效率高 执行性能好 Go语言应用的领域 服务端开发 日志处理 文件系统 监控服务 容器虚拟化 Docker k ...

  6. selected中第一项 请选择,隐藏

    如何做到selected 类似input的提示语  placeholder效果. <select class="wyj_dbfs"> <option style= ...

  7. 浅谈Java三大特性之继承

    前言 简单用伪代码去介绍一些 父类与子类的构造函数问题 others 前言 类的继承性是面向对象语言的基本特性,多态性前提是继承性.Java 支持继承性和多态性.——Java从小白到大牛 继承:三大特 ...

  8. 「AHOI2014/JSOI2014」奇怪的计算器

    「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...

  9. CentOS7配置python3教程

    环境准备: 1.python3.7.1 下载地址:https://www.python.org/    注意:CentOS7默认就有python2的 2.虚拟机CentOS 7 64位,下载地址:ht ...

  10. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:变量赋值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...