感想

真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来。
重构代码千万遍,依旧只有-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. Jenkins ChangeLog

    Log changes in Jenkins - Stack Overflowhttps://stackoverflow.com/questions/13631145/log-changes-in-j ...

  2. VMware虚拟机中常见的问题汇总

    在使用虚拟机进行开发工作的时候,经常会遇到各种各样的问题, 总结再次, 防微杜渐 1. wget: unable to resolve host address的解决方法 原因分析: DNS域名解析的 ...

  3. composer 自动加载 通过classmap自动架子啊

    https://github.com/brady-wang/composer github地址 composer加载自己写的类 放入一个目录下 更改composer.json "autolo ...

  4. java.lang(StringBuffer)

    public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharS ...

  5. v-router几种定义方式

    第一种 const router = new VueRouter({ routes: [{ path: '/newSongs', component: require('../views/NewSon ...

  6. C# Note21: 扩展方法(Extension Method)及其应用

    前言 今天在开会时提到的一个概念,入职3个多月多注重在项目中使用C#的编程知识,一直没有很认真地过一遍C#的全部语法,当我们新人被问及是否了解Extension Method时,一时之间竟不能很通俗准 ...

  7. csrf补充

    问csrftoken在Django里面是基于什么实现的?------>中间件. 如果是Django表示每次发请求过来的时候,要检验有没有带随机字符串.当在执行视图函数之前,前面还有一道屏障,这个 ...

  8. git客户端下载 和安装

    网址  https://git-scm.com/download/win 点击next 说明: (1)图标组件(Addition icons) : 选择是否创建桌面快捷方式. (2)桌面浏览(Wind ...

  9. kubernetes资源类别介绍

    类别 名称 资源对象 Pod.ReplicaSet.ReplicationController.Deployment.StatefulSet.DaemonSet.Job.CronJob.Horizon ...

  10. django mysql数据库使用自己的User

    由于我需要的User模型与django自带的User有所不同,所以需要定义自己的User Model,这里记录一下方法,适用于django 1.5+. 因为使用自己的后台,放弃django的管理后台, ...