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. PHP之位运算符

    使用场景: 1) 判断奇数偶数 ; $i < ; $i++) { ){ echo $i.PHP_EOL; } } //输出所有奇数 2)快速修改状态 $status1 = ; $status2 ...

  2. PropertyChangeSupport 监听器模式的应用

    PropertyChangeSupport 类实现的监听器功能 ,它是java jdk自带的一个类,用于监听某个对象属性的改变来触发相应信息,具体看代码介绍 import java.beans.Pro ...

  3. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  4. Laravel 5.2+ 使用url()全局函数返回前一个页面的地址

    注意:文章标题中5.2+表示该文章内容可向上兼容,适用于Laravel版本5.2及更高(目前最新为5.6),但不可向下兼容,即不适用于5.2版本以下.推荐大家花一点点时间,将自己的Laravel更新至 ...

  5. sass变量引入全局

    https://www.jianshu.com/p/ab9ab999344b(copy) 本文以Sass做案例,Less的参考,基本配置大同小异. 假如我们有一个Sass的全局变量common.scs ...

  6. AJAX+springmvc遇到的问题

    当我使用AJAX将表单的值传入处理器中后,经过了一个判断再进行页面跳转时,不能在处理器中使用重定向,它会将重定向的页面内容在AJAX的data中显示出来而不是显示一个页面 所以只能在AJAX 的suc ...

  7. SpringJdbc框架

    import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import JdbcUtils.Jdb ...

  8. 一、Dev

    一.获取选中的表格 // MessageBox.Show(gridview_Parent.GetFocusedDataRow()["series"].ToString());//获 ...

  9. git 提交的步骤

    1. git init //初始化仓库   2. git add .(文件name) //添加文件到本地仓库   3. git commit -m "first commit" / ...

  10. Stream、FileStream、MemoryStream的区别

    1.Stream:流,在msdn的定义:提供字节序列的一般性视图,Stream提供了读写流的方法是以字节的形式从流中读取内容.而我们经常会用到从字节流中读取文本或者写入文本,微软提供了StreamRe ...