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. virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntu

    virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntuhttps://askubuntu.com/questi ...

  2. 转:Linux下查看tomcat占用端口

    https://blog.csdn.net/liufuwu1/article/details/71123597[root@server-crm mysql]# ps -ef | grep " ...

  3. Java8 Lambda和Stream的用法

    package com.zhangxueliang.demo; import java.util.ArrayList; import java.util.List; import java.util. ...

  4. Day 4-2 random模块

    import random random.randint(1,100) # 从1到100中随机取出一个数.包含100 random.randrange(1,100) #功能和上面一样.只是不包含100 ...

  5. Day2 列表,元组,字典,集合

    一,列表 定义:[]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素. list=['alex', 'jack', 'chen', 'shaoye'] #创建一个列表. 特性: 1.可存 ...

  6. Hbase表结构模型

  7. 安装MongoDB(做成Windows服务)并加载C#驱动程序

    一 Mongodb简介: 通过查询网上的一些信息来介绍一下Mongodb的优势:MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL.在使用Mo ...

  8. ConnectTimeout和ReadTimeout所代表的意义

    参考:ConnectTimeout和ReadTimeout所代表的意义 ConnectTimeout 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间. 在java中,网络状况 ...

  9. github & markdown & collapse & table

    github & markdown collapse & table https://github.com/Microsoft/TypeScript/issues/30034 GitH ...

  10. 用织梦建站如何去掉a这个目录,还有内容页的a

    1.另外建一个站点,将物理路径直接指向a即可. 2.去掉文章页生成的带a的路径: 只需要这一句话:  function='str_replace("/a","" ...