题目: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. 转: Android开发的网络抓包

    方法就是在android机器上面安装tcpdump,然后通过-w参数把抓包记录到本地,再把抓到的.cap文件导到pc上面用wireshark来分析.这里步骤非常多,在和后台联调的时候,这个效率是非常低 ...

  2. 转:mybatis——select、insert、update、delete

    一.select <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String&qu ...

  3. Scala 基础新手教程

    1.前言 近期在參加Hadoop和Spark培训.须要使用Scala,自学了一下作为入门.这里作一个记录. 2.下载 1) 在scala官网下载.地址: http://www.scala-lang.o ...

  4. construct-binary-tree-from-preorder-and-inorder-traversal——前序和中序求二叉树

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:  You may assume tha ...

  5. poj Kindergarten

    Kindergarten 又是一道自己没思考出来的题 !!!!! 还是老样子,题目去我拉的专题里有. 题目: 给出G给女孩,B给男孩.女孩之间是相互认识的,男孩之间也是相互认识的.如今题目中给出M对男 ...

  6. DB 【ACID】

    http://blog.csdn.net/shuaihj/article/details/14163713 http://blog.csdn.net/dief913975849/article/det ...

  7. 【转载】FAT32文件系统详解

    硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS,EXT ...

  8. linux 块设备驱动(五)——块设备应用层的操作

    一: 加载好sbull驱动 root@CarRadio:/# ls /dev/sbull -l brw-r--r-- 1 root root 254, 16 Mar 25 08:25 /dev/sbu ...

  9. 零基础学python-2.18 异常

    这一节说一下异常except 继续沿用上一节的代码.我有益把文件名称字搞错.然后在结尾部分加上异常捕捉: try: handler=open("12.txt")#在这里我特别将文件 ...

  10. 修改JDK环境变量,不生效的问题

    一般是在/etc/profile下面配置JDK的环境变量 JAVA_HOME=/data/jdk1.7.0_72 JRE_HOME=/data/jdk1.7.0_72/jre PATH=$PATH:$ ...