【题目链接】

https://www.luogu.org/problemnew/show/P1312

【算法】

深度优先搜索

【代码】

#include<bits/stdc++.h>
using namespace std; struct info
{
int x,y,op;
} step[]; int i,n,t,x;
int a[][];
bool solved; inline void print()
{
int i;
for (i = ; i <= n; i++) printf("%d %d %d\n",step[i].x - ,step[i].y - ,step[i].op);
}
inline bool check()
{
int i;
for (i = ; i <= ; i++)
{
if (a[i][] != )
return false;
}
return true;
}
inline bool Remove()
{
int i,j,x,y,t;
bool ret = false;
bool d[][];
memset(d,false,sizeof(d));
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
if (a[i][j])
{
for (x = j + ; a[i][j] == a[i][x] && x <= ; x++);
if (x - j >= )
{
for (y = j; y < x; y++)
d[i][y] = true;
ret = true;
}
for (x = i + ; a[i][j] == a[x][j] && x <= ; x++);
if (x - i >= )
{
for (y = i; y < x; y++)
d[y][j] = true;
ret = true;
}
}
}
}
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
if (d[i][j])
a[i][j] = ;
}
}
for (i = ; i <= ; i++)
{
t = ;
for (j = ; j <= ; j++)
{
if (!a[i][j])
{
for (x = j + ; x <= && !a[i][x]; x++);
a[i][j] = a[i][x];
a[i][x] = ;
}
}
}
return ret;
} inline void dfs(int dep)
{
int i,j,x,y;
int b[][];
if (dep > n)
{
if (check())
{
solved = true;
print();
}
return;
}
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
b[i][j] = a[i][j];
}
}
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
if (i < && a[i][j] != )
{
if (a[i+][j] != )
{
step[dep] = (info){i,j,};
swap(a[i][j],a[i+][j]);
while (Remove());
dfs(dep+);
if (solved) return;
for (x = ; x <= ; x++)
{
for (y = ; y <= ; y++)
{
a[x][y] = b[x][y];
}
}
} else
{
step[dep] = (info){i,j,};
for (x = j - ; x >= && !a[i+][x]; x--);
a[i+][x+] = a[i][j];
for (x = j; x <= ; x++) a[i][x] = a[i][x+];
while (Remove());
dfs(dep+);
if (solved) return;
for (x = ; x <= ; x++)
{
for (y = ; y <= ; y++)
{
a[x][y] = b[x][y];
}
}
}
}
if (i > && a[i][j] != )
{
if (a[i-][j] == )
{
step[dep] = (info){i,j,-};
for (x = j - ; x >= && !a[i-][x]; x--);
a[i-][x+] = a[i][j];
for (x = j; x <= ; x++) a[i][x] = a[i][x+];
while (Remove());
dfs(dep+);
if (solved) return;
for (x = ; x <= ; x++)
{
for (y = ; y <= ; y++)
{
a[x][y] = b[x][y];
}
}
}
}
}
}
} int main()
{ scanf("%d",&n);
for (i = ; i <= ; i++)
{
t = ;
while (scanf("%d",&x) && x)
a[i][++t] = x;
}
solved = false;
dfs();
if (!solved) printf("-1\n"); return ; }

【NOIP 2011】 Mayan游戏的更多相关文章

  1. NOIp 2011 mayan游戏 搜索

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

  2. [NOIp 2011]Mayan游戏

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

  3. NOIP 2011 Mayan游戏 大暴搜

    题目链接:https://www.luogu.org/problemnew/show/P1312 我的第一篇题解!! 当然感谢ZAGER 的提示,他的链接https://www.cnblogs.com ...

  4. 洛谷 P1312 [ NOIP 2011 ] Mayan游戏 —— 搜索+模拟

    题目:https://www.luogu.org/problemnew/show/P1312 还是不擅长这种题,所以参考了一下TJ: 其实也很好搜,按字典序,先搜右移,再搜左移: 不交换相同颜色的两个 ...

  5. noip提高组2011 Mayan游戏

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

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

    感想 真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来. 重构代码千万遍,依旧只有-1输出. 正解 非常明显的一道搜索题目. 每一次记录上一级的状态,这样实现比较不容易出错. 然后考虑剪枝: ...

  7. NOIP 2011 Day 1

    NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面 ...

  8. [Luogu 1312] noip11 Mayan游戏

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

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

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

  10. NOIP2011 Mayan游戏

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

随机推荐

  1. HTML简单入门

    - Java攻城狮学习路线 - 基本结构 标准文档:www.w3.org <!DOCTYPE html> <html> <head> <meta charse ...

  2. 大白话理解cookie

    HTTP协议是一个无状态的协议,服务器无法区分出两次请求是否发送自同一服务器. 需要通过会话控制来解决这个问题,会话控制主要有两种方式Cookie 和 Session. Cookie就是一个头,Coo ...

  3. js 事件冒泡、事件捕获、stopPropagation、preventDefault

    转自:http://www.jb51.net/article/42492.htm (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: ...

  4. Linux之tar.gz file

    A tarball (tar.gz file) is compressed tar archive. The tar program provides the ability to create ta ...

  5. MxNet : use the MxNet windows versioin

    The MxNet needs  the following thirdparties: 1. lapack complie lapack-3.6.1: download the lapack-3.6 ...

  6. error C3859: 超过了PCH的虚拟内存范围;请使用“-Zm33”或更大的命令行选项重新编译

    编译 ORB_SLAM的Release版本时,出现了此问题: 错误 2 error C3859: 超过了 PCH 的虚拟内存范围;请使用"-Zm465"或更大的命令行 修改方法: ...

  7. 安卓代码迁移:Make.exe: *** [libs/armabi-v7a/gdbserver] Error 1

    解决办法1:安装ndk和eclipse修改为x86操作系统 解决办法2:降低更换NDK版本

  8. 解决postman https请求无返回数据的问题

    1.点击右上角的扳手图标 2.点击settings 3.点击general 4.把 ssl certificate verification这项点击关闭

  9. android apk的签名和权限问题

    一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名?      ...

  10. SQL第二节课

    SQL练习题 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的 ...