[NOIP2011提高组]Mayan游戏
题目:洛谷P1312、Vijos P1738、codevs1136。
题目大意:在一个7行5列的棋盘(左下角坐标0,0)上,有一些不同颜色的棋子。
规定某一时刻,连续三个横排或竖列的棋子颜色相同,则它们被消掉(同时满足条件的一起消掉,存在多个这样的情况有公共棋子时,所有的都消掉)。
然后有一种操作:
将一个棋子往左/右移动或和左边/右边的棋子交换。(左为-1,右为1)
规定棋盘上没有棋子时,游戏胜利。
现在给出顺时针旋转$90^\circ$后的棋盘,你要进行恰好n次操作,使游戏胜利,输出字典序最小(横坐标最小,然后纵坐标最小,然后方向最小,1比-1小)的操作方案。
如果不可能,输出-1。
解题思路:看到这么小的数据范围($n\leq 5$),肯定想到暴搜,而好像也没有别的方法。
题目要求字典序最小,那我们就按字典序最小的方案搜,找到就输出结束程序。
这里有一些剪枝:
①当一种颜色的个数为1或2时,一定不可能胜利,跳出。
②搜的时候,先搜往右的,如果当前棋子和右边棋子颜色相同,就不搜。
③搜左边时,只考虑左边为空的情况,如果不为空,则等价于左边的棋子向右交换的操作,字典序更小,因此一定不可能为答案。
消除的情况,可以枚举中间点,然后判断三个是否相同即可。
掉下来的情况,暴力移动即可。
剩下的,只需注意状态的保存和还原就行了。
别的没什么技巧可言。
C++ Code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
int n;
int bl[9][9],tong[12]={0},ansx[7],ansy[7],yd[7];
bool bj[9][9];
void clean(){
bool hasqc=true;
while(hasqc){
hasqc=false;
bool dxl=true;
while(dxl){
dxl=false;
for(int i=0;i<5;++i)
for(int j=0;j<8;++j)
if(bl[i][j]==0&&bl[i][j+1])
bl[i][j]=bl[i][j+1],bl[i][j+1]=0,dxl=true;
}
memset(bj,0,sizeof bj);
for(int i=0;i<5;++i)
for(int j=0;j<8;++j){
if(i&&i<4&&bl[i][j]&&bl[i][j]==bl[i-1][j]&&bl[i][j]==bl[i+1][j])
bj[i][j]=bj[i-1][j]=bj[i+1][j]=hasqc=true;
if(j&&bl[i][j]&&bl[i][j]==bl[i][j-1]&&bl[i][j]==bl[i][j+1])
bj[i][j]=bj[i][j-1]=bj[i][j+1]=hasqc=true;
}
if(hasqc){
for(int i=0;i<5;++i)
for(int j=0;j<8;++j)
if(bj[i][j])--tong[bl[i][j]],bl[i][j]=0;
}
}
}
void dfs(int now){
if(now>n){
for(int i=0;i<12;++i)
if(tong[i])return;
for(int i=1;i<=n;++i)
printf("%d %d %d\n",ansx[i],ansy[i],yd[i]);
exit(0);
}
for(int i=0;i<12;++i)
if(tong[i]&&tong[i]<3)return;
int ylzt[9][9],yltong[12];
for(int i=0;i<9;++i)for(int j=0;j<9;++j)
ylzt[i][j]=bl[i][j];
memcpy(yltong,tong,sizeof tong);
for(int i=0;i<5;++i){
for(int j=0;j<8;++j)
if(ylzt[i][j]){
if(i<4&&ylzt[i+1][j]!=ylzt[i][j]){
memcpy(tong,yltong,sizeof tong);
for(int i=0;i<9;++i)for(int j=0;j<9;++j)
bl[i][j]=ylzt[i][j];
int x=bl[i][j];
bl[i][j]=bl[i+1][j];
bl[i+1][j]=x;
ansx[now]=i,ansy[now]=j,yd[now]=1;
clean();
dfs(now+1);
}
if(i&&!ylzt[i-1][j]){
memcpy(tong,yltong,sizeof tong);
for(int i=0;i<9;++i)for(int j=0;j<9;++j)
bl[i][j]=ylzt[i][j];
bl[i-1][j]=bl[i][j];
bl[i][j]=0;
ansx[now]=i,ansy[now]=j,yd[now]=-1;
clean();
dfs(now+1);
}
}
}
for(int i=0;i<9;++i)for(int j=0;j<9;++j)
bl[i][j]=ylzt[i][j];
memcpy(tong,yltong,sizeof tong);
}
int main(){
scanf("%d",&n);
for(int i=0;i<5;++i){
int t;
scanf("%d",&t);
for(int j=0;t;++j){
bl[i][j]=t;
++tong[t];
scanf("%d",&t);
}
}
dfs(1);
puts("-1");
return 0;
}
[NOIP2011提高组]Mayan游戏的更多相关文章
- [NOIP2011] 提高组 洛谷P1312 Mayan游戏
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...
- 刷题总结——mayan游戏(NOIP2011提高组day2T3)
题目: 题目背景 NOIP2011提高组 DAY1 试题. 题目描述 Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个 7 行 5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...
- Noip2011 提高组 Day1 T3 Mayan游戏
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
- luogu1003铺地毯[noip2011 提高组 Day1 T1]
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- [NOIP2011] 提高组 洛谷P1315 观光公交
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
- [NOIP2011] 提高组 洛谷P1003 铺地毯
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- NOIP2011(提高组)DAY2---观光公交(vijosP1741)
描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景 ...
- 洛谷-铺地毯-NOIP2011提高组复赛
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
随机推荐
- 脚本_求和100以内的正整数.sh
#!bin/bash#功能:求和100以内的正整数#作者:liusingbon#seq 100 可以快速自动生成 100 个整数sum=0for i in $(seq 100)do sum=$[ ...
- epoll的边缘触发与水平触发
epoll的边缘触发与水平触发 Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读 ...
- NOI 2018 屠龙勇士 (拓展中国剩余定理excrt+拓展欧几里得exgcd)
题目大意:略 真是一波三折的一道国赛题,先学了中国剩余定理,勉强看懂了模板然后写的这道题 把取出的宝剑攻击力设为T,可得Ti*x=ai(mod pi),这显然是ax=c(mod b)的形式 这部分用e ...
- 2019-03-18 OpenCV Tesseract-OCR 下载 安装 配置(cv2 报错)
OpenCV 下载 安装 配置 1.下载和Python版本对应的版本,此为下载地址 2.安装(在powershell管理员模式下安装) pip3 install .\opencv_python-3.4 ...
- js滚动事件实现滚动触底加载
移动端触底加载时前端开发过程中常用功能,主要是通过三个值的大小来进行判断: 首先介绍jquery的写法,代码如下: $(window).scroll(function(){ var windowH=$ ...
- 【henuacm2016级暑期训练-动态规划专题 C】Little Girl and Maximum XOR
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑r最后的二进制形式为 1xxxxx 那么我们肯定想让第一个最高位的1保留. 因此我们选取的另外一个数字 一定是 0xxxxx的形 ...
- Myeclipse学习总结(9)——MyEclipse2014安装插件的几种方式(适用于Eclipse或MyEclipse其他版本)
众所周知MyEclipse是一个很强大的Java IDE,而且它有许多开源免费又好用的插件,这些插件给我们开发过程中带来了许多方便.插件具有针对性,例如,你如果做安卓开发,可能需要一个ADT(Andr ...
- DDL表结构修改
*1)创建表 create table 表名( 字段名 类型, .... ); //以现有表复制一个新表 create table j012 as se ...
- LaTeX 图片色偏解决方法
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50327113 在LaTeX的编辑模式中 ...
- Floodlight 中创建消息对象的方法
在 floodlight 中创建各种openflow message 和 action 等採用的是简单工厂方式.BasicFactory类(实现OFMessageFactory接口.) ...