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. How to Configure Email Notification in Jenkins

    How to Configure Email Notification in Jenkins? - The Official 360logica Bloghttps://www.360logica.c ...

  2. 【Python3练习题 010】将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

    #参考http://www.cnblogs.com/iderek/p/5959318.html n = num = int(input('请输入一个数字:'))  #用num保留初始值 f = []  ...

  3. Python解释器有哪些?Python解释器种类

    Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码,以下是常用的五种Python解释 ...

  4. day84

    在建表写字端时,id可以不写,orm会自动创建 表模型如果不写主键,orm会自动创建一个主键 from django.db import models # Create your models her ...

  5. k8s容器的资源限制

    1.k8s支持内存和cpu的限制 requests:容器运行需求,最低保障limits:限制,硬限制(资源上限) CPU: 1颗逻辑CPU(1核CPU=4个逻辑CPU) 1物理核=1000个微核(mi ...

  6. 微信小程序wxml無法實現頁面跳轉的問題

    wxml的 navigator的url設置后無法跳轉? 檢查要跳轉的頁面是否是在APP.json的tabBar里註冊過,如果是tabBar頁面是不能用wx.navigateTo和wx.Redirect ...

  7. Python——线程1

    多线程并发 from threading import Thread import time #多线程并发 def func(n): time.sleep(1) print(n) for i in r ...

  8. HTTP协议 - 基础认识

    在http协议使用场景上我们最熟悉的可能就是浏览器了,作为本系列第一篇,就讲一个问题  ”浏览器怎么连接上服务器并获取网页内容的“ : 首先 浏览器怎么连接上服务器的? 如果对OSI七层模型或者TCP ...

  9. SQL 添加索引

    使用CREATE 语句创建索引 CREATE INDEX index_name ON table_name(column_name,column_name) include(score) 普通索引 C ...

  10. How to create ISO on macOS

    hdiutil makehybrid -iso -joliet -o test1.iso /users/test/test1