[noip2011 luogu1312] Mayan游戏(模拟)
原题:传送门
大模拟…
两个剪枝:
1.如果左边不为空就不往左边走(因为一定不如左边的移到右边优)
2.如果相邻两颜色相同不需移动
当然也有别的小剪枝(我没写)比如如果当前某一颜色剩余块数满足1<=x<=2就显然不可能满足等等
code;
//By Menteur_Hxy
#include <cstdio>
#include <cstring>
#include <iostream>
#define F(i,a,b) for(register int i=(a);i<(b);i++)
using namespace std;
int n;
int mp[20][5][7],ansx[20],ansy[20],ansv[20];
bool vis[5][7];
int rd() {
int x=0,fla=1; char c=' ';
while(c<'0' || c>'9') {c=getchar();if(c=='-') fla=-fla;}
while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
return x*fla;
}
void fall(int dep) {
F(i,0,5) { int cnt=0;
F(j,0,7) if(mp[dep][i][j]) mp[dep][i][cnt++]=mp[dep][i][j];
while(cnt<7) mp[dep][i][cnt++]=0;
}
}
void fre(int dep) {
bool flag=true;
while(flag) {
flag=false; fall(dep);
F(i,0,5) F(j,0,7) if(mp[dep][i][j]) {
if(i>1) if(mp[dep][i][j]==mp[dep][i-1][j] && mp[dep][i][j]==mp[dep][i-2][j])
flag=vis[i][j]=vis[i-1][j]=vis[i-2][j]=1;
if(j>1) if(mp[dep][i][j]==mp[dep][i][j-1] && mp[dep][i][j]==mp[dep][i][j-2])
flag=vis[i][j]=vis[i][j-1]=vis[i][j-2]=1;
}
F(i,0,5) F(j,0,7) if(vis[i][j]) mp[dep][i][j]=vis[i][j]=0;
}
}
bool dfs(int dep) {
F(i,0,5) F(j,0,7) mp[dep][i][j]=mp[dep-1][i][j];
fre(dep);
if(dep==n+1) {
F(i,0,5) if(mp[dep][i][0]) return false;
return true;
}
F(i,0,5) F(j,0,7) if(mp[dep][i][j]) {
if(i<4 && mp[dep][i][j]!=mp[dep][i+1][j]) {
ansx[dep]=i,ansy[dep]=j,ansv[dep]=1;
swap(mp[dep][i][j],mp[dep][i+1][j]);
if(dfs(dep+1)) return true;
swap(mp[dep][i][j],mp[dep][i+1][j]);
}
if(i && !mp[dep][i-1][j]) {
ansx[dep]=i,ansy[dep]=j,ansv[dep]=-1;
swap(mp[dep][i][j],mp[dep][i-1][j]);
if(dfs(dep+1)) return true;
swap(mp[dep][i][j],mp[dep][i-1][j]);
}
}
return false;
}
int main() {
n=rd();
F(i,0,5) F(j,0,9) {
int x=rd();
if(!x) break;
mp[0][i][j]=x;
}
if(dfs(1)) F(i,1,n+1) printf("%d %d %d\n",ansx[i],ansy[i],ansv[i]);
else printf("-1");
return 0;
}
[noip2011 luogu1312] Mayan游戏(模拟)的更多相关文章
- luogu1312 Mayan游戏 剪枝
题目大意 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
- 【noip2011】Mayan游戏
题解: 刷了一天的noip啊 做了10题! 突然找回了做马拉松的感觉- - 我中午竟然放弃治疗去看视频 做到晚上累得都快挂了 用电脑放一些rock 把音乐当咖啡硬撑下来 但是还是没能刷3届 唉 显然速 ...
- 「NOIP2011」Mayan游戏
传送门 Luogu 解题思路 爆搜,并考虑几个剪枝. 不交换颜色相同的方块(有争议,但是可以过联赛数据 \(Q \omega Q\)) 左边为空才往左换 右边不为空才往右换 因为对于两个相邻方块,右边 ...
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
- NOIP2011 Mayan游戏
3 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上 ...
- luoguP1312 Mayan游戏 题解(NOIP2011)
luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...
- 洛谷P1312 Mayan游戏
P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...
- Luogu 1312 【NOIP2011】玛雅游戏 (搜索)
Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空 ...
- Luogu P1312 Mayan游戏(搜索)
P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...
随机推荐
- 【ACM】nyoj_7_街区最短路径问题_201308051737
街区最短路径问题时间限制:3000 ms | 内存限制:65535 KB 难度:4描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间隔相等. ...
- 洛谷—— P2014 选课
https://www.luogu.org/problem/show?pid=2014 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课 ...
- 数学之路-python计算实战(4)-Lempel-Ziv压缩(2)
Format characters have the following meaning; the conversion between C and Python values should be o ...
- maven 镜像使用
maven中的snapshot来源与注意事项 maven中的snapshot来源与注意事项 (2012-04-23 15:37:48) 转载▼ 标签: 杂谈 分类: java maven的依赖管理是基 ...
- PHP反射类的理解(代码篇)
<?php/** * Created by PhpStorm. * User: * Date: 2017/6/12 * Time: 14:34 * 关于反射类的理解 */class Person ...
- vue+element-ui实现前端分页
按照他的文档来写分页 最主要的是 el-table里面展示的数据怎么处理 <el-table :data="AllCommodityList.slice((currentPage-1 ...
- EOJ 3348 树的顺序存储结构
前面介绍了树的链式存储结构,那么如何用顺序存储来存储一棵树呢?在顺序存储时,我们除了存储每个结点值外,还要存储树中结点与结点之间的逻辑关系(即双亲与孩子结点之间的关系).下面介绍树的双亲存储法. 编号 ...
- 利用道格拉斯·普客法(DP法)压缩矢量多边形(C++)
1.算法描述 经典的Douglas-Peucker算法(简称DP法)描述如下: (1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦: (2)得到曲线上离该直线段距离最大的点C,计算其与A ...
- iOS数组越界
数组越界就是假如你的下标总数现在为32个,然后你在下一秒又执行了一个方法要从50个数据里进行赋值啊筛选之类的,而你此时数组里的值为32个,50的数据还没有请求到,往往会出现数组越界的崩溃信息,大概是这 ...
- SSRS 报表 如何加参数
SSRS 报表 如何加参数 连接上以后出现一个问题 就是给报表加上参数以后报表不断刷新,跟上次那个报表刷新是同样的问题.那么下面我们来解决一下. 1. 这是给报表添加默认参数进入页面后就不断的刷新刷新 ...