[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 .现在将这些地毯按照编号从小到大的顺序平行于 ...
随机推荐
- Django框架详解之url
Django基本命令 下载Django pip3 install django 创建一个django project django-admin.py startproject cms 当前目录下会生成 ...
- 路飞学城Python-Day35
08-初识SQL语句 数据库客户端操作的内容(增查改删): 1.操作数据库 操作数据库 增(本质上就是创建一个本地文件夹) create database db1 charset utf8; 查 查看 ...
- C语言基本语法——结构体、联合和枚举
一.结构体 1.什么是结构体 2.结构体语法格式 3.结构体所占内存空间 4.结构体成员赋值 二.联合 1.什么是联合 2.联合语法格式 三.枚举 1.什么是枚举 2.枚举语法格式 一.结构体 1.什 ...
- W10如何开启LinuxBash及安装Ubuntu
W10如何开启LinuxBash的功能 1)开启开发人员模式 2)启动部分windows功能 完成后重启系统 然后在cmd中输入bash按命令操作即可使用bash命令 3)下载安装ubuntu lxr ...
- STM32 HAL库利用DMA实现串口不定长度接收方法
参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...
- 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数
我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...
- (转载)使用Maven构建多模块项目
原文:https://www.cnblogs.com/xdp-gacl/p/4242221.html#undefined 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最 ...
- 监控Apache计数器
- 学一下HDFS,很不错(大数据技术原理及应用)
http://study.163.com/course/courseMain.htm?courseId=1002887002 里面的HDFS这一部分.
- [CSS3] All abourt responsive image
Take few examples: Full size image: The problem for that is it overflow when the screen size is smal ...