有趣的题面

超有趣的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的更多相关文章

  1. luogu1312 Mayan游戏 剪枝

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

  2. [noip2011 luogu1312] Mayan游戏(模拟)

    原题:传送门 大模拟- 两个剪枝: 1.如果左边不为空就不往左边走(因为一定不如左边的移到右边优) 2.如果相邻两颜色相同不需移动 当然也有别的小剪枝(我没写)比如如果当前某一颜色剩余块数满足1< ...

随机推荐

  1. Leetcode——198. 打家劫舍

    题目描述:题目链接 这道题目也是一道动态规划的题目: 分析一道动态规划的题目可以将解决问题的思路分为下面三个部分: 1:问题的描述.可以定义数组d[ i ] 用于表示第i -1家可以获得的最大金额. ...

  2. .NET Core中向已存在文件的特定位置写入数据

    本例使用.NET Core向一个文本文件中的特定位置写入数据,来模拟文件上传中的断点续传是如何在服务器端实现的. 新建一个.NET Core控制台项目FileContinueToWrite,其Prog ...

  3. 20155334 曹翔 《网络对抗》逆向及Bof基础

    20155334 曹翔 <网络对抗>逆向及Bof基础 实践目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...

  4. WPF编程,通过Double Animation动态缩放控件的一种方法。

    原文:WPF编程,通过Double Animation动态缩放控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  5. 查询表的DDL

    例如: SQL>create table tab001(id varchar(4)); SQL>select dbms_metadata.get_ddl(‘TABLE’,’tab001’) ...

  6. JSON传输数组的基本操作

    目标JSON结果如下: 生成JSON的的过程如下: Document document; Document::AllocatorType& allocator = document.GetAl ...

  7. CS190.1x-ML_lab1_review_student

    这是CS190.1x第一次作业,主要教你如何使用numpy.numpy可以说是python科学计算的基础包了,用途非常广泛.相关ipynb文件见我github. 这次作业主要分成5个部分,分别是:数学 ...

  8. 【原】python3.7 无法pip安装提示ssl错误解决方案

    问题 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not av ...

  9. B1022. D进制的A+B

    除基取余法 #include<bits/stdc++.h> using namespace std; stack<int> s; int main(){ long long a ...

  10. 区块链--Bitcoin共识机制

    目录 中心化和去中心化 比特币共识机制 拜占庭将军共识机制 比特币成功解决了拜占庭问题 中心化和去中心化 中心化模式: 优点:效率高 缺点:中间层次太多(组织层次连接) 去中心化模式: 缺点:效率低 ...