Mayan puzzle是最近流行起来的一个游戏。游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:

1 、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落。

Solution

注意到n非常小,所以直接暴力就好,枚举格子,先枚举向右移动,在向左移动。

有一个小剪枝,向左移动时要移动到空的位置,如果不是,那就不是最优解(右边可以动过来)。

注意读入!!!!

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define R register
using namespace std;
int a[][],n,tot,bul[];
bool tag[][];
struct node{
int x,y,tag;
}ji[];
inline void print(){
for(int i=;i<=;++i){
for(int j=;j<=;++j)cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
inline bool isempty(){
for(R int i=;i>=;--i)
for(R int j=;j<=;++j)
if(a[i][j])return ;
return ;
}
inline bool isk(){
bool p=;
memset(tag,,sizeof(tag));
for(R int j=;j<=;++j)
for(R int i=;i>=;--i)if(a[i][j]){
if(a[i][j]==a[i][j+]&&a[i][j]==a[i][j-])tag[i][j]=tag[i][j-]=tag[i][j+]=,p=;
if(a[i][j]==a[i-][j]&&a[i][j]==a[i+][j])tag[i][j]=tag[i-][j]=tag[i+][j]=,p=;
}
return p;
}
inline void gan(){
for(R int i=;i>=;--i)
for(R int j=;j<=;++j)
if(a[i][j]&&(!a[i+][j])){
int pos=i;
while(pos!=&&a[pos][j]&&(!a[pos+][j]))swap(a[pos][j],a[pos+][j]),pos++;
}
while(isk()){
for(R int j=;j<=;++j)
for(R int i=;i>=;--i)if(tag[i][j])bul[a[i][j]]--,a[i][j]=;
for(R int i=;i>=;--i)
for(R int j=;j<=;++j)
if(a[i][j]&&(!a[i+][j])){
int pos=i;
while(pos!=&&a[pos][j]&&(!a[pos+][j]))swap(a[pos][j],a[pos+][j]),pos++;
}
}
}
void dfs(int x){
if(isempty()){
for(R int i=;i<=tot;++i)printf("%d %d %d\n",ji[i].x,ji[i].y,ji[i].tag);
exit();
}
if(x>n)return;
// for(R int i=1;i<=10;++i)if(bul[i]==1||bul[i]==2)return;
int b[][],mp[];
for(int i=;i<=;++i)mp[i]=bul[i];
for(R int i=;i<=;++i)for(R int j=;j<=;++j)b[i][j]=a[i][j];
for(R int j=;j<=;++j)
for(R int i=;i>=;--i)
if(a[i][j]){
if(a[i][j]!=a[i][j+]&&j<){
swap(a[i][j],a[i][j+]);
ji[++tot]=node{j-,-i,};
gan();
dfs(x+);
tot--;
for(R int i=;i<=;++i)for(R int j=;j<=;++j)a[i][j]=b[i][j];
for(R int i=;i<=;++i)bul[i]=mp[i];
}
if(!a[i][j-]&&j>){
swap(a[i][j],a[i][j-]);
ji[++tot]=node{j-,-i,-};
gan();
dfs(x+);
tot--;
for(R int i=;i<=;++i)for(R int j=;j<=;++j)a[i][j]=b[i][j];
for(R int i=;i<=;++i)bul[i]=mp[i];
}
}
}
int main(){
scanf("%d",&n);
for(R int i=;i<=;++i)
for(R int j=;j>=;--j){
scanf("%d",&a[j][i]);
if(!a[j][i])break;
bul[a[j][i]]++;
}
dfs();
cout<<-;
return ;
}

NOIP2011Mayan游戏(模拟)的更多相关文章

  1. Noip2011Mayan游戏

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

  2. 【ccf2017-12-2】游戏(模拟)

    问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋 ...

  3. 仿苹果电脑任务栏菜单&&拼图小游戏&&模拟表单控件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

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

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

  5. Uva 127 poj 1214 `Accordian'' Patience 纸牌游戏 模拟

    Input Input data to the program specifies the order in which cards are dealt from the pack. The inpu ...

  6. 牛客编程巅峰赛S1第11场 - 黄金&钻石 A.牛牛的01游戏 (模拟栈)

    题意:有一个\(01\)串,两个相邻的\(0\)可以变成一个\(1\),两个相邻的\(1\)可以直接消除,问操作后的字符串. 题解:数组模拟栈直接撸,上代码吧. 代码: class Solution ...

  7. 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索

    第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...

  8. UVA 246 10-20-30 10-20-30游戏 模拟+STL双端队列deque

    Input Each input set consists of a sequence of 52 integers separated by spaces and/or ends of line. ...

  9. xdotool模拟击键和鼠标移动

    最近双十一抢红包的活动比较火,我也就去玩了一下,在一个小活动里,需要不停的点击左箭头和右箭头,让红包不停的跑,但自己点的比较慢,老是出现下面的图片 看到提示还有n多公里才跑完,感觉极度不爽,一怒之下, ...

随机推荐

  1. 便捷的ajax请求

    为什么要做这个呢?如果后端给的数据不单有JSON字符串,还有对象呢?这个时候我们就要每个都处理(JSON.parse).万一后端又改了,所有都是对象呢?如此一来我们就需要对我们的ajax进行封装. 这 ...

  2. YOLO.h5 下载

    链接:https://pan.baidu.com/s/1sTxkuaFWXqT4yXLHQ9BgUA 密码:ga0o fhwayd_w1231234asd><321$%

  3. jquery on绑定事件

    描述:给一个或多个元素(当前的或未来的)的一个或多个事件绑定一个事件处理函数.(1.7版本开始支持,是 bind().live() 和 delegate() 方法的新的替代品) 语法:.on( eve ...

  4. Java 获取当前日期的四种方法

    //1 通过Date类来获取当前时间,通过SimpleDateFormat来设置时间格式 SimpleDateFormat dateFormat = new SimpleDateFormat(&quo ...

  5. from组件补充

    一.定义的规则 class TeacherForm(Form): #必须继承Form # 创建字段,本质上是正则表达式 username = fields.CharField( required=Tr ...

  6. hadoop分布式系统架构详解

    hadoop 简单来说就是用 java写的分布式 ,处理大数据的框架,主要思想是 “分组合并” 思想. 分组:比如 有一个大型数据,那么他就会将这个数据按照算法分成多份,每份存储在 从属主机上,并且在 ...

  7. CentOS7装Tomcat

    有两种安装方式:(1)yum 命令  (2)安装包 本次采用第二种方式: 1.windos下载apache-tomcat-7.0.73.tar.gz安装包 2.通过WinSCP传到linux下(本次放 ...

  8. python之路--小数据池,再谈编码,is和 == 的区别

    一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...

  9. postfix 邮箱设置及常见错误

    postfix 邮箱设置及常见错误 1.如果装了sendmail的话,先卸载了. yum remove sendmail 2.安装 Postfix yum install postfix 3.更改默认 ...

  10. Python memecache

    memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载,故常用来做数据库缓存.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...