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. ansible jenkins war

    Ansible is Simple IT Automationhttps://www.ansible.com/ Ansible中文权威指南- 国内最专业的Ansible中文官方学习手册http://a ...

  2. Python3练习题 022:用递归函数反转字符串

    方法一 str = input('请输入若干字符:')   def f(x):     if x == -1:         return ''     else:         return s ...

  3. hangfire使用笔记

    1.导入nuget包 2.配置 简单配置后就可以写自己的Job了 注意:Hangfire.RecurringJobExtensions这个扩展支持两种job添加方法:json配置文件和特性.但由于时区 ...

  4. HTTL之初印象

    概述 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. 简洁 ...

  5. 使用PSR-4配合composer autoload 自动加载文件夹

    require 文件很麻烦,使用PSR-4搭配composer一次加载,终生受用. 感觉类似java中的import了,自己先记录一下最近理解的. 用composer管理自己的包吧 安装compose ...

  6. [转帖]SAP一句话入门:Project System

    SAP一句话入门:Project System http://blog.vsharing.com/MilesForce/A621279.html 这是SAP ERP入门的最后一篇了. 我们这些死跑龙套 ...

  7. IDEA 各版本在线激活(激活码)

    lan yu 大佬的授权又被封杀了,还好我收藏了一些其他的服务器地址. 在线授权服务器 https://jetlicense.nss.im/ 授权代码 K03CHKJCFT-eyJsaWNlbnNlS ...

  8. Oracle转换函数

    ()--转换函数 --数字转换字符串 )||'分' from dual; ||'' from dual; ()--日期转字符串 select to_char(sysdate,'yyyy-mm-dd') ...

  9. hadoop的缺点

    Hadoop的限制 Hadoop只能执行批量处理,并且只以顺序方式访问数据.这意味着必须搜索整个数据集,即使是最简单的搜索工作.

  10. 安装VC++2015运行库时出现0x80240037错误

    很多时候,当我们将开发好的软件部署到用户的机器上时总会出现各种意想不到的错误,最近在一台原版Windows7系统的电脑上安装VC++运行库的时候,莫名的出现安装失败,然后错误代码为:0x8024003 ...