纯搜索,,,模拟,,还不算太难,,就是细节略繁琐
  首先因为题目要求保证字典序,所以显然把右边的块换到左边不如把左边的块换到右边优,
所以可以进行不小规模的剪枝,之后显然交换两块相同的色块没有意义,至此基本可以通过,在clear过程中最好对即将删除的色块打标记再统一删除,以避免出现意外情况,同时每次clear之后要在进行fall处理,因为每次操作可能引发连锁反应
  两次没过样例, 第一次手抖把x 打成了x + 1, 第二次写fall时忘记将之前落下的删掉
  WA掉一次,读入时以为每行最多7个数,忘记考虑结尾的0
 #include <cstdio>
#include <cstring>
#include <algorithm>
//#define debug
//#define debug2 const int maxn = ;
int n;
int m[maxn][maxn][maxn];
int f[maxn][maxn];
int ans[][]; bool cl(int x) {
memset(f, , sizeof(f));
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++) {
if (m[x][i][j] == ) break;
if (f[i][j] != && i > && m[x][i-][j] == m[x][i][j] && m[x][i-][j] == m[x][i][j]) {
f[i-][j] = ;
f[i-][j] = ;
f[i][j] = ;
int cur = i + ;
while (cur <= && m[x][cur][j] == m[x][i][j]) {
f[cur][j] = ;
cur++;
}
cur = i - ;
while (cur > && m[x][cur][j] == m[x][i][j]) {
f[cur][j] = ;
cur--;
}
}
if (f[i][j] != && j > && m[x][i][j-] == m[x][i][j] && m[x][i][j-] == m[x][i][j]) {
f[i][j-] = ;
f[i][j-] = ;
f[i][j] = ;
int cur = j + ;
while (cur <= && m[x][i][cur] == m[x][i][j]) {
f[i][cur] = ;
cur++;
}
cur = j - ;
while (cur > && m[x][i][cur] == m[x][i][j]) {
f[i][cur] = ;
cur--;
}
}
}
bool is_c = ;
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++) {
if (f[i][j] > ) {
is_c = ;
m[x][i][j] = ;
}
}
return (is_c);
} void fall(int x) {
for (int i = ; i <= ; i++) {
int cur = ;
for (int j = ; j <= ; j++) {
if (m[x][i][j] > ) {
cur++;
m[x][i][cur] = m[x][i][j];
if (j != cur) m[x][i][j] = ;
}
}
}
} void dfs(int x) {
#ifdef debug
for (int i = ; i <= n; i++) {
printf("%d %d %d\n", ans[i][], ans[i][], ans[i][]);
}
printf("\n\n");
#endif
#ifdef debug2
if (ans[][] == && ans[][] == && ans[][] == ) {
printf("kkk\n");
}
#endif
if (x == n + ) {
fall(x);
cl(x);
fall(x);
while (cl(x)) fall(x);
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++) {
if (m[x][i][j] > ) return;
}
for (int i = ; i <= n; i++) {
printf("%d %d %d\n", ans[i][], ans[i][], ans[i][]);
}
exit();
}
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++) {
if (m[x][i][j] == ) continue;
if (i < && m[x][i+][j] == ) {
memcpy(m[x+], m[x], sizeof(m[x]));
m[x+][i+][j] = m[x][i][j];
m[x+][i][j] = ;
fall(x + );
while (cl(x + )) fall(x + );
ans[x][] = i - ;
ans[x][] = j - ;
ans[x][] = ;
dfs(x + );
}
if (i < && m[x][i+][j] > && m[x][i+][j] != m[x][i][j]) {
memcpy(m[x+], m[x], sizeof(m[x]));
m[x+][i+][j] = m[x][i][j];
m[x+][i][j] = m[x][i+][j];
fall(x + );
while (cl(x + )) fall(x + );
ans[x][] = i - ;
ans[x][] = j - ;
ans[x][] = ;
dfs(x + );
}
if (i > && m[x][i-][j] == ) {
memcpy(m[x+], m[x], sizeof(m[x]));
m[x+][i-][j] = m[x][i][j];
m[x+][i][j] = ;
fall(x + );
while (cl(x + )) fall(x + );
ans[x][] = i - ;
ans[x][] = j - ;
ans[x][] = -;
dfs(x + );
}
}
} int main () {
scanf("%d", &n);
for (int i = ; i <= ; i++) {
for (int j = ; j <= ; j++) {
scanf("%d", &m[][i][j]);
if (m[][i][j] == ) break;
}
}
dfs();
printf("-1\n");
return ;
} /*
1
1 0
2 1 0
2 1 4 0
3 4 0
2 3 3 4 0
*/

mayan 游戏 search的更多相关文章

  1. $Mayan$游戏

    \(Mayan\)游戏 好啊,一年(半年)来的梦魇,终于结束了. 其实我从来没料到整体竟然会如此暴力--做的时候机房里冷得很,感觉晕晕乎乎地做完了,晕晕乎乎地调了好久,晕晕乎乎地听(看了题解的)\(q ...

  2. NOIP2011 Mayan游戏

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

  3. noip提高组2011 Mayan游戏

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

  4. [题目] Luogu P1312 Mayan游戏

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

  5. 洛谷P1312 Mayan游戏

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

  6. [Luogu 1312] noip11 Mayan游戏

    [Luogu 1312] noip11 Mayan游戏 Problem: Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  7. luoguP1312 Mayan游戏 题解(NOIP2011)

    luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...

  8. Luogu P1312 Mayan游戏(搜索)

    P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...

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

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

随机推荐

  1. HDU 1575 Tr A( 简单矩阵快速幂 )

    链接:传送门 思路:简单矩阵快速幂,算完 A^k 后再求一遍主对角线上的和取个模 /********************************************************** ...

  2. Vue基础知识点

    基础知识: vue的生命周期: beforeCreate/created.beforeMount/mounted.beforeUpdate/updated.beforeDestory/destorye ...

  3. POJ 2183

    模拟题 #include <iostream> #include <cstdio> #include <algorithm> using namespace std ...

  4. codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱

    #include <cstdio> #include <cstring> #include <algorithm> #include <string> ...

  5. Linux xhost命令详解

    xhost 命令用途 控制什么人可以访问当前主机上的增强 X-Windows. 语法 xhost [ + | - ] [ Name ] "+"表示增加,"-"表 ...

  6. oracle 11g rac for linux add node (oracle 11g rac 节点添加)

    说明: Adding Oracle RAC to Nodes with Oracle Clusterware Installed步骤来自ORACLE 官方文档: https://docs.oracle ...

  7. Codeforces 703D Mishka and Interesting sum 离线+树状数组

    链接 Codeforces 703D Mishka and Interesting sum 题意 求区间内数字出现次数为偶数的数的异或和 思路 区间内直接异或的话得到的是出现次数为奇数的异或和,要得到 ...

  8. 读取XML字符串到临时表

    DECLARE @hdoc int DECLARE @doc xml SET @doc = '<CityValueSet> <CityItem> <CityId>2 ...

  9. 一个php处理图片裁剪,压缩,水印的小代码

    插件地址:https://github.com/cigua/imagefilter

  10. Optional是以enum和泛型为基础的高阶类型

    结论:1.optionals使用时需要检查:2.可以通过!+赋值语句转化为非optionals. Optional-Generic Enumeration enum Optional<T> ...