纯搜索,,,模拟,,还不算太难,,就是细节略繁琐
  首先因为题目要求保证字典序,所以显然把右边的块换到左边不如把左边的块换到右边优,
所以可以进行不小规模的剪枝,之后显然交换两块相同的色块没有意义,至此基本可以通过,在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. 斯特林公式--取N阶乘近似值

    斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式.一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候, ...

  2. [CodeForces]1006F Xor Path

    双向搜索. 水div3的时候最后一道题由于C题死活看不懂题 来不及做F了Orz.. 因为n,m是20,双向搜索一下,求个到中间的Xor值的方案,统计一下即可. 时间复杂度\(O(2^{21})\) 好 ...

  3. 【 【henuacm2016级暑期训练】动态规划专题 G】 Palindrome pairs

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先用枚举回文串中点的方法. 得到这个字符串中出现的所有的回文. 得到他们的左端点以及右端点. 整理成一个pair<int,in ...

  4. android 使用讯飞人脸识别api报错:java.lang.UnsatisfiedLinkError

    1.在做一个人脸识别的项目,使用的是讯飞的api,编辑器为AS2.0,运行时报如下错误: FATAL EXCEPTION: main                  Process: com.adm ...

  5. Mysql学习总结(30)——MySQL 索引详解大全

    什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类 ...

  6. Nutch命令大全

    Nutch采用了一种命令的方式进行工作,其命令可以是对局域网方式的单一命令也可以是对整个Web进行爬取的分步命令.主要的命令如下: 1. Crawl Crawl是"org.apache.nu ...

  7. Methods and systems for sharing common job information

    Apparatus and methods are provided for utilizing a plurality of processing units. A method comprises ...

  8. 使用BabeLua在cocos2d-x中编辑和调试Lua

    使用BabeLua在cocos2d-x中编辑和调试Lua BabeLua是一款基于VS2012/2013的Lua集成开发环境,具有Lua语法高亮,语法检查.自己主动补全.高速搜索,注入宿主程序内对Lu ...

  9. WPF silverlight获取子控件(获取DataTemplate里的子控件)

    public static class VisualTreeExtensions { /// <summary> /// 获取父节点控件 /// </summary> /// ...

  10. android:异步任务asyncTask介绍及异步任务下载图片(带进度条)

    为什么要用异步任务? 在android中仅仅有在主线程才干对ui进行更新操作.而其他线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把全部的操作都放在主线程中操作 .比方 ...