感想

真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来。
重构代码千万遍,依旧只有-1输出。

正解

非常明显的一道搜索题目。
每一次记录上一级的状态,这样实现比较不容易出错。
然后考虑剪枝:如果相同就不交换。
以下这个代码开了O2才过掉。

代码

#include <bits/stdc++.h>
#define ms(a, b) memset(a, b, sizeof(a))
#define ll long long
#define ull unsigned long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define db double
#define Pi acos(-1)
#define eps 1e-8
#define N 15
using namespace std;
template <typename T> T sqr(T x) { return x * x; }
template <typename T> void read(T &x) {
    x = 0; T fl = 1; char ch = 0;
    for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') fl = -1;
    for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
    x *= fl;
}
template <typename T> T power(T x, T y, T mod) { T res = 1;  for (; y; y >>= 1) { if (y & 1) res = (res * x) % mod; x = (x * x) % mod; } return res; }
template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); }
template <typename T> void writeln(T x) { write(x); puts(""); }
struct Ans_Rec{ int x, y, opt; } ans[N];
int a[N][N][N], tmp[N][N];
int n;
bool Is_Empty(int d) { for (int i = 0; i < 5; i ++) for (int j = 0; j < 7; j ++) if (a[d][i][j]) return false; return true; }
void Fall_Down(int d) {
    for (int i = 0; i < 5; i ++)  {
        int sz = 0; for (int j = 0; j < 7; j ++) if (a[d][i][j]) a[d][i][sz ++] = a[d][i][j];
        while (sz < 7) a[d][i][sz ++] = 0;
    }
}
void print() { for (int i = 1; i <= n; i ++) printf("%d %d %d\n", ans[i].x, ans[i].y, ans[i].opt); }
void upd(int d) {
    for (bool flag = true; flag; ) {
        flag = false;
        Fall_Down(d);
        for (int i = 0; i < 5; i ++) for (int j = 0; j < 7; j ++) if (a[d][i][j]) {
            if (i < 3) if (a[d][i][j] == a[d][i + 1][j] && a[d][i][j] == a[d][i + 2][j]) flag = tmp[i][j] = tmp[i + 1][j] = tmp[i + 2][j] = 1;
            if (j < 5) if (a[d][i][j] == a[d][i][j + 1] && a[d][i][j] == a[d][i][j + 2]) flag = tmp[i][j] = tmp[i][j + 1] = tmp[i][j + 2] = 1;
        }
        for (int i = 0; i < 5; i ++) for (int j = 0; j < 7; j ++) if (tmp[i][j]) a[d][i][j] = tmp[i][j] = 0;
    }
}
void dfs(int Orz) {
    for (int i = 0; i < 5; i ++) for (int j = 0; j < 7; j ++) a[Orz][i][j] = a[Orz - 1][i][j];
    upd(Orz);
    if (Orz == n + 1) { if (Is_Empty(Orz)) {print(); exit(0); } return; }
    for (int i = 0; i < 5; i ++) for (int j = 0; j < 7; j ++) if (a[Orz][i][j]) {
        if (i < 4 && a[Orz][i][j] != a[Orz][i + 1][j]) {
            ans[Orz].x = i, ans[Orz].y = j, ans[Orz].opt = 1;
            swap(a[Orz][i][j], a[Orz][i + 1][j]);
            dfs(Orz + 1);
            swap(a[Orz][i][j], a[Orz][i + 1][j]);
        }
        if (i && a[Orz][i][j] != a[Orz][i - 1][j]) {
            ans[Orz].x = i, ans[Orz].y = j, ans[Orz].opt = -1;
            swap(a[Orz][i][j], a[Orz][i - 1][j]);
            dfs(Orz + 1);
            swap(a[Orz][i][j], a[Orz][i - 1][j]);
        }
    }
}
int main() {
    read(n);
    for (int i = 0; i < 5; i ++) { for (int j = 0; ; j ++) { read(a[0][i][j]); if (a[0][i][j] == 0) break; }}
    dfs(1); puts("-1");
    return 0;
}

⌈洛谷1312⌋⌈NOIP提高组2011⌋Mayan游戏【搜索】的更多相关文章

  1. 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏

    Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...

  2. noip提高组2011 Mayan游戏

    Mayan游戏 描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关 ...

  3. 洛谷P1006 NOIP提高组2008 传纸条

    P1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无 ...

  4. 洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]

    P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 ...

  5. 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】

    U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...

  6. 题解——洛谷P2827 NOIP提高组 2016 蚯蚓

    队列模拟 详细题解待填坑 #include <cstdio> #include <algorithm> #include <queue> #include < ...

  7. 题解——洛谷 P2680 NOIP提高组 2015 运输计划

    树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...

  8. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  9. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

随机推荐

  1. Telnet服务器和客户端请求处理

    Telnet服务器和客户端请求处理 本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例. 开始我的第一个Telnet控制台项目之旅: 创建控 ...

  2. alibaba druid

    FAQ · alibaba/druid Wikihttps://github.com/alibaba/druid/wiki/FAQ sql 连接数不释放 ,Druid异常:wait millis 40 ...

  3. 学习笔记:filter_var()函数

    PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤 filter_var() 函数通过指定的过滤器过滤变量. 如果成功,则返回已过滤的数据,如果失败,则返回 false. 语法 f ...

  4. Java 简单的登录验证码

    1 验证码的作用 验证码是为了区分人与机器,如果没有验证码机制,web网站或者应用会遇到很多问题,具体如下: ① 网站容易被暴力登录攻破密码,可以制作一个自动程序不断的尝试登录,密码很容易被破解,系统 ...

  5. 查找文献的BibTex

    BibTex可以通过Google Scholar来查找. 注意,默认情况下,Google scholar 关闭了显示BibTex链接. 打开Google Scholar 选择右上角菜单按钮 选择set ...

  6. Git本地仓库push至GitHub远程仓库每次输入账户密码问题解决(亲测可行)

    在使用git push命令将本地仓库内容推送至GitHub远程仓库的每一次git都要让我们输入GitHub的用户名和密码.这着实让我们心烦.我们会有疑问,我明明设置了公钥呀!怎么还需要输入账户和密码? ...

  7. Day 5-6 反射和内置方法之item系列

    python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) #!_*_ coding:utf-8 _*_ class People: def ...

  8. CLOUD SQL跟踪

    CLOUD会自动在后台执行一些sql语句,所以追踪起来比较麻烦,需要加入一些过滤条件. 比如关键的CLIENTPROCESSID,加入后 ,就能过滤是哪个客户度执行的数据. 过滤数据.

  9. YAML配置:mapping values are not allowed here

    在配置Eureka服务器配置文件的时候,出现了mapping values not allowed here的错误,原因是的冒号 ”:“后面没有空格. 原因分析:yml文件中,键值对是以": ...

  10. idea 方便的设置代码段

    使用快捷键(ctrl+alt+s)找到:从idea的菜单File->Settings->Editor->Live Templates 先添加Template Group,然后添加Li ...