感想

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

    一.序言: 今天同事部署环境遇到问题, 原因1:修改了主机名,在/etc/hosts文件中加了3台集群的ip和主机名,但是将默认的前两行也改了,没注意看改了哪里, 现象: 1.zookeeper单台可 ...

  2. Python爬虫:爬取人人都是产品经理的数据

    爬取内容: 人人都是产品经理首页(www.woshipm.com)左侧[最新文章]下如图样式的文章标题.浏览量和缩略图. 思路: 1. 用BeautifulSoup解析网页 变量名 = Beautif ...

  3. #Leetcode# 1009. Complement of Base 10 Integer

    https://leetcode.com/problems/complement-of-base-10-integer/ Every non-negative integer N has a bina ...

  4. HDU 2003 求绝对值

    http://acm.hdu.edu.cn/showproblem.php?pid=2003 Problem Description 求实数的绝对值.   Input 输入数据有多组,每组占一行,每行 ...

  5. 08-webpack的介绍

    在这里我仅仅的是对webpack做个讲解,webpack这个工具非常强大,解决了我们前端很繁琐的一些工具流程繁琐的事情.如果感兴趣的同学,简易还是看官网吧. 中文链接地址:https://www.we ...

  6. js文字从左边飞入效果

    贴代码之前,我们先讲一下它的原理,我们使用setInterval,让文字一开始置于屏幕看不到的位置,左右上下都可以,然后让它的位置不断移入到屏幕看得到的位置. 下面上代码: html: <h2 ...

  7. linux 安装 SVN server

    安装 使用yum安装非常简单: yum install subversion 配置 2.1. 创建仓库 我们这里在/home下建立一个名为svn的仓库(repository),以后所有代码都放在这个下 ...

  8. Oracle可视化工具PL/SQL Developer的安装与配置

    安装程序: 安装目录不能有中文和空格,否则无法进行远程连接. 推荐使用 D:\PLSQLDeveloper 为安装目录 破解PLSQLDeveloper 使用工具 PLSQL Developer10. ...

  9. PreparedStatement和Statement

    1 . PreparedStatement 接口继承 Statement , PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2  ...

  10. python之路--基础数据类型的补充与深浅copy

    一 . join的用法 lst =['吴彦祖','谢霆锋','刘德华'] s = '_'.join(lst) print(s) # 吴彦祖_谢霆锋_刘德华 # join() "*" ...