【题目链接】

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. Intellij IDEA 2018.3.5版安装详解及破解

    几个参考链接: 软件下载链接:https://www.jetbrains.com/idea/ 破解补丁:链接:https://pan.baidu.com/s/1xUbil5jq_DyTbXJWUUsM ...

  2. C#使用wkhtmltopdf,把HTML生成PDF(包含分页)

    最近花了2天多的时间终于把HTML生成PDF弄好了.步骤如下: 1.首先是技术选型.看了好多都是收费的就不考虑了. 免费的有: jsPDF(前端生成,清晰度不高,生成比较慢) iText(严格要求ht ...

  3. 【SQL】BETWEEN操作符

    BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围. 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期. 注意: ...

  4. handyJson的技术内核

    1.swift对象内存模型: 2.指针操作: 3.协议.泛型.扩展: 4.kvc: 1是所有实现的基础,没有内存对象(类)模型,后面的一切都我从谈起. 在1的基础上使用2进行对象模型信息的提取和转换. ...

  5. fileupload 上传控件

    <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:But ...

  6. 继承(day09)

    二十一 继承(Inheritance) ... 子类的构造函数和析构函数 5.1 子类的构造函数 )如果子类构造函数没有显式指明基类子对象的初始化方式,那么该子对象将以无参方式被初始化. )如果希望基 ...

  7. POJ2431-Expedition【优先队列+贪心】

    题目大意:卡车每走一公里就消耗一单位的汽油,初始时给你p单位油,你要到达l距离的终点.其中路上有n个补给点可以加油,并且油箱容量无限大,问你最少可以停车几次. 思路:因为油箱无限大,所以我们可以这么认 ...

  8. python爬虫05 | 年轻人,不会正则表达式你睡得着觉?有点出息没有?

    现在 你已经会使用 python 模拟浏览器 进行一些 Http 的请求了 那么请求完之后 服务器返回给我们一堆源代码 我们可不是啥都要的啊 我们是有原则的 我们想要的东西 怎么能一股脑的啥都往自己兜 ...

  9. JavaSE 学习笔记之接 口(六)

    接 口: 1:是用关键字interface定义的. 2:接口中包含的成员,最常见的有全局常量.抽象方法. 注意:接口中的成员都有固定的修饰符. 成员变量:public static final     ...

  10. Redis参数

    phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: Redis::__construct构造函数$redis ...