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

自己写了很久。又T又WA的。

发现对题理解有误。改完后应该只有T了,但还是T的。

自己写了许多剪枝,很鸡肋。

然后去看Zinn的题解。

重要剪枝:交换的话只从左向右即可!!!向左的只能是空格。两个颜色相同的话就不要换了!(虽然可能需要故意浪费步数?)

然后就变得非常快。但WA了1个点。去掉自以为等价的那个地方就能了,而且好像还变快了?不知为何。该处见注释。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,K=;
int n,sta[N][],a[N][N][N],cnt,ct[K],sum,mx;
int xx[]={-,,,},yy[]={,-,,};
bool vis[N][N],eflag;
void dfs(int cr,int x,int y,int fx)
{
cnt++;vis[x][y]=;
int tx=x+xx[fx],ty=y+yy[fx];
if(!vis[tx][ty]&&a[cr][tx][ty]==a[cr][x][y])
dfs(cr,tx,ty,fx);
}
void cz(int cr,int x,int y)
{ if(x>&&a[cr][x-][y]==a[cr][x][y]&&a[cr][x-][y]==a[cr][x][y])
dfs(cr,x,y,);
if(y>&&a[cr][x][y-]==a[cr][x][y]&&a[cr][x][y-]==a[cr][x][y])
dfs(cr,x,y,);
//上面两个去掉会错?//去掉上面还会变慢?
if(x<&&a[cr][x+][y]==a[cr][x][y]&&a[cr][x+][y]==a[cr][x][y])
dfs(cr,x,y,);
if(y<&&a[cr][x][y+]==a[cr][x][y]&&a[cr][x][y+]==a[cr][x][y])
dfs(cr,x,y,);
}
void xc(int cr)
{
int tmp[N][N]={};
for(int i=;i<=;i++)
{
int p0=;
for(int j=;j<=;j++)
{
while(p0<&&vis[i][p0])p0++;
if(vis[i][p0]||!a[cr][i][p0])break;
tmp[i][j]=a[cr][i][p0];p0++;
}
}
memcpy(a[cr],tmp,sizeof tmp);
}
void clear(int cr)
{
while()
{
memset(vis,,sizeof vis); cnt=;
for(int i=;i<=;i++)
for(int j=;j<=&&a[cr][i][j];j++)
if(!vis[i][j])cz(cr,i,j);
if(!cnt)break; xc(cr); sum-=cnt;
}
}
void calc(int cr,int x,int y,int op)
{
memcpy(a[cr],a[cr-],sizeof a[cr-]);
if(a[cr][x+op][y])
{
if(a[cr][x][y]==a[cr][x+op][y])return;
swap(a[cr][x][y],a[cr][x+op][y]);
clear(cr); return;
}
else
{
for(int i=;i<=;i++)
if(!a[cr][x+op][i])
{a[cr][x+op][i]=a[cr][x][y];break;}
for(int i=y;i<=;i++)a[cr][x][i]=a[cr][x][i+];
clear(cr); return;
}
}
bool pan(int cr)
{
memset(ct,,sizeof ct);
for(int i=;i<=;i++)
for(int j=;j<=&&a[cr][i][j];j++)
ct[a[cr][i][j]]++;
for(int i=;i<=mx;i++)if(ct[i]==||ct[i]==)return false;
return true;
}
void solve(int cr)
{
if(cr>n)
{
eflag=!sum; return;
}
int ysum=sum;
for(int i=;i<=;i++)
for(int j=;j<=&&a[cr-][i][j];j++)
{
if(i<&&a[cr-][i][j]!=a[cr-][i+][j])
{
calc(cr,i,j,);
if(pan(cr))
{
sta[cr][]=i;sta[cr][]=j;sta[cr][]=;
solve(cr+); if(eflag)return;
}
sum=ysum;
}
if(i>&&!a[cr-][i-][j])
{
calc(cr,i,j,-);
if(pan(cr))
{
sta[cr][]=i;sta[cr][]=j;sta[cr][]=-;
solve(cr+); if(eflag)return;
}
sum=ysum;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=;i++)
for(int j=;j<=;j++)//
{
scanf("%d",&a[][i][j]);
if(!a[][i][j])break;
ct[a[][i][j]]++; sum++; mx=max(mx,a[][i][j]);
}
if(!pan()){puts("-1");return ;} solve();
if(eflag)
{
for(int i=;i<=n;i++)
printf("%d %d %d\n",sta[i][],sta[i][],sta[i][]);
}
else puts("-1");
return ;
}

洛谷 1312 Mayan游戏——暴搜+剪枝的更多相关文章

  1. 洛谷1312 Mayan游戏

    原题链接 讨厌这种大搜索题 基本就是模拟搜索,注意细节即可. 以下是我用的两个剪枝: 将块向左移的前提是左边为空,因为该题要求先右后左,所以若左边有块,那么在上一次搜索向右移的时候一定会搜过,且字典序 ...

  2. 洛谷P2236 HNOI2002 彩票 [暴搜]

    题目传送门 彩票 分析: 虽然题目标签上标的是Splay,但我一个蒟蒻至今也沒掌握平衡树,所以就索性一个暴搜,加一点剪枝就水过去了- 代码: #include<cstdio> #inclu ...

  3. 洛谷P1312 Mayan游戏

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

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

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

  5. 洛谷 P1312 Mayan游戏

    题解:搜索+模拟 剪枝: 最优性剪枝:x从小到大,y从小到大,第一次搜到的就是字典序最小 的最优解. 最优性剪枝:把一个格子和左边格子交换,和左边格子和右边格 子交换是等价的,显然让左边格子和右边交换 ...

  6. 洛古 P1312 Mayan游戏(dfs+剪枝)

    题目链接 这道题和俄罗斯方块很像 很明显,我们可以看出这是一个dfs,但是,我们需要几条剪枝: 1.如果只剩下1个或2个同样颜色的方块,那么直接退出 2.相同的块不用交换 3.注意优先性,优先左边换右 ...

  7. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  8. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  9. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

随机推荐

  1. php 源码编译

    https://cyberpersons.com/2016/08/28/install-nginx-php-php-fpm-mysql-source-run-wordpress-site-ubuntu ...

  2. log4net报错Could not load type 'System.Security.Claims.ClaimsIdentity'

    使用log4net,在win7上可以正常使用,但是在部分xp电脑上可以生成access数据库,但是无法写数据到mdb 排除了程序原因,怀疑是xp缺少什么dll之类的 偶然查到log4net的调试方法: ...

  3. SWF代码分析与破解之路 (YueTai VIP视频信息获取工具) Socket续篇

    引言 上一篇 <Socket与站点保密应用 (隐藏链接的视频下载)>大大咧咧地从 WEB 讲 Socket.再到 TCP/IP 等协议,又再讲到 Wireshark 怎样抓IP包分析.最还 ...

  4. LINUXFOUNDATION EVENTS

    http://events.linuxfoundation.org/ #lflks This invitation-only event focuses on development and inno ...

  5. Finder 快捷键

    记录几个常用的 Finder 快捷键: 复制 Finder 里选中的路径:option+cmd+c 地址栏跳到指定路径:shift+cmd+g 增加标签:cmd+t 显示/隐藏 标签栏:shift+c ...

  6. HBase写请求分析

    HBase作为分布式NoSQL数据库系统,不单支持宽列表.而且对于随机读写来说也具有较高的性能.在高性能的随机读写事务的同一时候.HBase也能保持事务的一致性. 眼下HBase仅仅支持行级别的事务一 ...

  7. 关于erlang的向上取整和向下取整

    在erlang的API中,erlang:trunc/1 是就近取整,erlang:round/1是四舍五入的, 整理下:对于正数的向上和向下取整, %% 向上取整 ceil(N) -> T = ...

  8. mongodb 安装、启动

    MongoDB 之 你得知道MongoDB是个什么鬼 MongoDB - 1   最近有太多的同学向我提起MongoDB,想要学习MongoDB,还不知道MongoDB到底是什么鬼,或者说,知道是数据 ...

  9. 九度OJ 1134:密码翻译 (翻译)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1988 解决:810 题目描述: 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报 ...

  10. git 的安装

    git在开发中已经成了必备工具了,我们来看看git在各个平台上的安装 1.Linux上安装git $sudo apt-get install git 2.mac上安装 1)homebrew安装git ...