luogu1312
超有趣的dfs大模拟,码了巨久,卡时过了此题qaq
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,mp[][][];
struct answer{int x,y,op;}re[];
bool arr[][];
inline void fall(int now)
{
int i,j,sz;
for(i=;i<=;i++)
{
sz=;
for(j=;j<=;j++)
{
if(mp[now][i][j]) mp[now][i][sz++]=mp[now][i][j];
}while(sz<) mp[now][i][sz++]=;
}
}//顾名思义模拟方块掉落
inline void chag(int now)
{
int i,j; bool bo=;
for(bo=;bo;)
{
bo=; fall(now);
for(i=;i<=;i++)
{
for(j=;j<=;j++)
{
if(mp[now][i][j])
{
if(i<)
{
if(mp[now][i][j]==mp[now][i+][j]&&mp[now][i][j]==mp[now][i+][j])
{
bo=arr[i][j]=arr[i+][j]=arr[i+][j]=;
}
}
if(j<)
{
if(mp[now][i][j]==mp[now][i][j+]&&mp[now][i][j]==mp[now][i][j+])
{
bo=arr[i][j]=arr[i][j+]=arr[i][j+]=;
}
}
}
}
}
for(i=;i<=;i++)
{
for(j=;j<=;j++)
{
if(arr[i][j]) arr[i][j]=mp[now][i][j]=;
}
}
}
}//找到所有连续3个的方块删去,就是这么丑qaq
inline bool dfs(int now)
{
int i,j; for(i=;i<=;i++)for(j=;j<=;j++)mp[now][i][j]=mp[now-][i][j]; chag(now);
if(now==n+)
{
for(i=;i<=;i++)if(mp[now][i][])return false; return true;
}
for(i=;i<=;i++)
{
for(j=;j<=;j++)
{
if(mp[now][i][j])
{
if(i<&&mp[now][i][j]!=mp[now][i+][j])//交换相同的毫无意义
{
re[now].x=i; re[now].y=j; re[now].op=;
swap(mp[now][i][j],mp[now][i+][j]);
if(dfs(now+))return true;//暴力搜索
swap(mp[now][i][j],mp[now][i+][j]);//回溯
}
if(i&&!mp[now][i-][j])//如果上一个有的话显然是向右交换字典序更小啊
{
re[now].x=i; re[now].y=j; re[now].op=-;
swap(mp[now][i][j],mp[now][i-][j]);
if(dfs(now+))return true;//搜搜搜
swap(mp[now][i][j],mp[now][i-][j]);
}
}
}
}return false;
}
int main()
{
int i,j,x,bo; scanf("%d",&n); memset(arr,,sizeof arr);
for(i=;i<=;i++)
{
for(j=;j<=;j++)
{
scanf("%d",&x); if(!x)break; mp[][i][j]=x;
}
}bo=dfs(); if(!bo)return *printf("-1\n");
for(i=;i<=n;i++)printf("%d %d %d\n",re[i].x,re[i].y,re[i].op);
}
luogu1312的更多相关文章
- luogu1312 Mayan游戏 剪枝
题目大意 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
- [noip2011 luogu1312] Mayan游戏(模拟)
原题:传送门 大模拟- 两个剪枝: 1.如果左边不为空就不往左边走(因为一定不如左边的移到右边优) 2.如果相邻两颜色相同不需移动 当然也有别的小剪枝(我没写)比如如果当前某一颜色剩余块数满足1< ...
随机推荐
- DC-DC Controllers Use Average-Current-Mode Control for Infotainment Applications-3939
DC-DC Controllers Use Average-Current-Mode Control for Infotainment Applications Abstract: Auto info ...
- TortoiseSVN 只取下或更新部分文件的方法(Sparse Update/Sparse Checkout)
Sparse Update/Sparse Checkout To easily select only the items you want for the checkout and force ...
- odoo tree视图 当页不弹窗显示方法
<xpath expr="//tree" position="attributes"> <attribute name='editable'& ...
- 使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号
Novell.Directory.Ldap.NETStandard是一个在.NET Core中,既支持Windows平台,又支持Linux平台,进行Windows AD域操作的Nuget包. 首先我们 ...
- 2PC AND 3PC
一.分布式数据一致性 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上. (1)什么是数据一致性 在数据有多份副本的情况下,如果网络 ...
- Go语言安全编码规范-翻译(分享转发)
Go语言安全编码规范-翻译 本文翻译原文由:blood_zer0.Lingfighting完成 如果翻译的有问题:联系我(Lzero2012).匆忙翻译肯定会有很多错误,欢迎大家一起讨论Go语言安全能 ...
- 20155202《网络对抗》Exp8 Web基础
20155202<网络对抗>Exp8 Web基础 基础问题回答 什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息 ...
- 20155311 Exp3 免杀原理与实践
20155311 Exp3 免杀原理与实践 •免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. [基础问题回答] (1)杀软是如何检测出恶意代码的? 1.通过特征 ...
- Centos7 定时任务启动python脚本发送邮件
直接上python脚本: 2.我是把这个脚本放在home文件夹下面 3.在centos命令模式下: crontab -e 命令编辑启动脚本: 4.第一个命令意思是:每天9点到下午5点,每隔一个小时 ...
- mfc 重载赋值运算符
重载赋值运算符= 一.重载运算符格式 返回类型 operator 运算符 (参数); 如: bool operator=(char*s); int operator>(char*s); bool ...