深搜+模拟

需要剪枝:同一移动向右移了就不需要向左移了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,bo[6][8],tot,a[6][6][8],b[6][3];
bool boo;
int print(int x){
printf("\n");
for(int i=0;i<5;i++){
for(int j=0;j<7;j++)
printf("%d ",a[x][i][j]);
printf("\n");
}
printf("\n");
return 0;
}
bool boooo[5]={0};
void fall(int step){
for(int i=0;i<5;i++){
int bottom=0;
while(a[step][i][bottom]) bottom++;
if(bottom>=7) continue;
for(int j=bottom;j<7;j++){
if(a[step][i][j]){
a[step][i][bottom++]=a[step][i][j];
a[step][i][j]=0;
}
}
}
}
bool wipe(int step){
boo=0; tot++;
for(int i=0;i<5;i++)
for(int j=2;j<7;j++){
if(!a[step][i][j]) break;
if(a[step][i][j]==a[step][i][j-1]&&a[step][i][j]==a[step][i][j-2])
bo[i][j]=bo[i][j-1]=bo[i][j-2]=tot;
}
for(int i=0;i<7;i++)
for(int j=2;j<5;j++){
if(!a[step][j][i]) break;
if(a[step][j][i]==a[step][j-1][i]&&a[step][j][i]==a[step][j-2][i])
bo[j][i]=bo[j-1][i]=bo[j-2][i]=tot;
}
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
if(bo[i][j]==tot){
a[step][i][j]=0;
boo=1;
}
return boo;
}
void move(int step,int x,int y,int pos){
swap(a[step][x][y],a[step][x+pos][y]);
fall(step);
while(wipe(step)==1)
fall(step);
}
void dfs(int step,int x,int y,int pos){
if(step>n) return;
if(step!=0){
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
a[step][i][j]=a[step-1][i][j];
move(step,x,y,pos);
b[step][0]=x;
b[step][1]=y;
b[step][2]=pos;
}
boo=0;
bool vis[6][8]={0};
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
if(a[step][i][j]){
boo=1;
if(i!=4){
dfs(step+1,i,j,1);
vis[i+1][j]=1;
}
if(i&&(!vis[i][j]))dfs(step+1,i,j,-1);
}
if(boo==0){
for(int i=1;i<=step;i++)
printf("%d %d %d\n",b[i][0],b[i][1],b[i][2]);
exit(0);
}
}
int main()
{
freopen("mayan.in","r",stdin);
freopen("mayan.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<5;i++){
int j=0;
while(scanf("%d",&a[0][i][j++])==1&&a[0][i][j-1]!=0){}
}
dfs(0,0,0,0);
printf("-1\n");
return 0;
}

noip2011 玛雅游戏 大模拟的更多相关文章

  1. NOIP2011玛雅游戏

    闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...

  2. [NOIP2011]玛雅游戏

    闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...

  3. [COGS 622] [NOIP2011] 玛雅游戏 模拟

    整个模拟的关键除了打出来就是一个剪枝:对于两个左右相邻的块你不用再走←,因为走→是等效的 #include<cstdio> #include<cstring> #include ...

  4. Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝

    写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...

  5. 玛雅游戏[NOIP2011]

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

  6. Luogu 1312 【NOIP2011】玛雅游戏 (搜索)

    Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空 ...

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

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

  8. [NOIP2011] mayan游戏(搜索+剪枝)

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

  9. Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)

    猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...

随机推荐

  1. Course4-Python ftp/ssh

    1. ftp Python 自带有模块支持ftp. 可以参看一下代码. #!/usr/bin/env python import sys import os import time import ge ...

  2. 《C++标准程序库》学习笔记(一)C++相关特性

    抱着本厚厚的<C++标准库>读了几天,想想也该写点关于用法的总结,一来怕今后容易忘记,二来将书上的事例重新敲一遍,巩固对程序库相关知识的了解.今天开第一篇,以后不固定更新.当然,笔者所读为 ...

  3. Centos7 时区的设置

    Linux 系统(我特指发行版, 没说内核) 下大部分软件的风格就是不会仔细去考虑向后 的兼容性, 比如你上个版本能用这种程序配置, 没准到了下一个版本, 该程序已经不见了. 比如 sysvinit ...

  4. iOS9自动布局神器StackView

    http://www.jianshu.com/p/767f72b7d754 这篇文章紧跟上边autolayout的一些小技巧,如果你没有看过,不防先看下<你真的会用autolayout吗?> ...

  5. 【python进阶】深入理解系统进程2

    前言 在上一篇[python进阶]深入理解系统进程1中,我们讲述了多任务的一些概念,多进程的创建,fork等一些问题,这一节我们继续接着讲述系统进程的一些方法及注意点 multiprocessing ...

  6. GitHub学习笔记:远程端的操控

    对于远端,当你新建一个项目的时候,需要在网页处新建,在新建项目的页面,会有一段提示你上传本地项目到此远端方法的代码,直接拷贝粘贴到git shell就可以解决问题,不再详述. 当你把代码上传到一个已经 ...

  7. windows下安装mysql驱动mysql-python

    Windows下直接pip安装会出错 解决方案 到Python Extension Packages for Windows - Christoph Gohlke 下载MySQL_python‑1.2 ...

  8. 设计模式的征途—13.代理(Proxy)模式

    所谓代购,简单说来就是找人帮忙购买所需要的商品.代购分为两种类型,一种是因为在当地买不到某件商品,又或者是因为当地这件商品的价格比其他地区的贵,因此托人在其他地区甚至国外购买该商品,然后通过快递发货或 ...

  9. SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...

  10. .NET开发微信小程序-获取OpenId

    注:获取当前用户信息只需要用GetUserInfo这个方法就行.这里就不需要提了 前端代码: CallBack:回调函数 function GetOpenID(CallBack){ var appIn ...