⌈洛谷1312⌋⌈NOIP提高组2011⌋Mayan游戏【搜索】

时间:2022-03-23 04:30:29

感想

真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来。
重构代码千万遍,依旧只有-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 &lbrack;NOIP2011提高组Day1T3&rsqb;Mayan游戏

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

  2. noip提高组2011 Mayan游戏

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

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

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

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

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

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

    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【动态开节点&sol;树状数组】【双头链表模拟】

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

  9. 洛谷P1084 &lbrack;NOIP2012提高组Day2T3&rsqb;疫情控制

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

随机推荐

  1. acm之poj题库1019方法

    认识了几个师弟,一直总想把自己的经验表达出来一些,让后面的人在更年轻的时候,认识到方向.努力. 昨天忽然想起自己在大学时候做了几天的acm,终于也没能坚持.然后就感觉带师弟们做下acm题目还是很不错. ...

  2. 实时监控log文件

    一个进程在运行,并在不断的写log,你需要实时监控log文件的更新(一般是debug时用),怎么办,不断的打开,关闭文件吗? 不用,至少有两个方法,来自两个很常用的命令: tail -f log.tx ...

  3. &lbrack;Android&rsqb; 修改设备访问权限

    在硬件抽象层模块中,我们是调用open函数来打开对应的设备文件的.例如,在2.3.2小节中开发的硬件抽象层模块freg中,函数freg_device_open调用open函数来打开设备文件/dev/f ...

  4. Struts2学习笔记 国际化(Internationalization)

    概述 国际化(Internationalization),通途的讲,就是让软件实现对多种语言的支持.可以通过简单的设置就可以从一种语言切换到另一种语言.用的最多的地方就是在应用程序的界面表示上.我们经 ...

  5. MTU &amp&semi; MSS 详解记录(转)

              先学习理解一下帧的封装格式:   需要注意的是,区别两种帧封装格式:802标准帧和以太网帧 1,在802标准定义的帧格式中,长度字段是指它后续数据的字节长度,但不包括C R C检验 ...

  6. ServerSocket详解及线程阻塞&lowbar;03

    ServerSocket详解构造方法ServerSocket()ServerSocket(int port)ServerSocket(int port ,int backlog)serverSocke ...

  7. win10 新建文件夹没有了

    1运行-regedit 2 在打开的注册表编辑器窗口,展开HKEY_CLASSES_ROOT,在HKEY_CLASSES_ROOT展开项中找到:Directory,再依次展开:Directory\Ba ...

  8. JS设计模式(12)装饰者模式

    什么是装饰者模式? 定义:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且 ...

  9. Android 开发 框架系列 Google的ORM框架 Room

    目录 简介 导入工程 使用流程概况 一个简单的小Demo 深入学习 @Entity使用 自定义表名 tableName  自定义字段名@ColumnInfo 主键 @PrimaryKey 索引 @In ...

  10. VBA汇总同目录下的所有工作簿数据到另一个工作簿,并进行统计

    Sub clData() Dim ComputerCount As Object tms = Timer p = ThisWorkbook.Path & "\" f = D ...