[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 .现在将这些地毯按照编号从小到大的顺序平行于 ...
随机推荐
- luogu P2000 拯救世界 生成函数_麦克劳林展开_python
模板题. 将所有的多项式按等比数列求和公式将生成函数压缩,相乘后麦克劳林展开即可. Code: n=int(input()) print((n+1)*(n+2)*(n+3)*(n+4)//24)
- jQuery中的DatePicker今天按钮不起作用
转载:http://codego.net/63433/ jquery-ui 日期选择器datepicker我想用 jQueryUI 的 DatePicker ,并显示“今天”按钮, 但它不工作,它也不 ...
- 在centos里安装Nginx
(1)下载Nginx的RPM包 wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx ...
- 每日Linux命令--不完整命令
配置文件优化,即把默认的空行还有#注释行去掉,优化前先拷贝一份配置文件 egrep -v '^$|#' 拷贝的配置文件 > 原配置文件 mysql如何修改root用户的密码 方法1: 用SET ...
- ubuntu18.04crontab定时任务不执行
环境介绍: 本人使用python写了一个自动化提交巡检的脚本放在服务器上,使用crontab去执行脚本的时候动作并没有执行,查看crontab日志时也不存在这个日志文件.如何如排查呢? 解决方案: 步 ...
- OO第二单元总结——电梯调度问题
一.设计策略. 在三次作业中,多线程程序的实现分以下几个步骤: 1. 主线程Main类的创建多个线程. 2. 共享对象的synchronized锁保证线程之间的互斥访问. 3. 采用notifyAll ...
- MyBatis学习总结(3)——优化MyBatis配置文件中的配置
一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: <?xml version="1 ...
- (转)redis源代码分析 – event library
每个cs程序尤其是高并发的网络服务端程序都有自己的网络异步事件处理库,redis不例外. 事件库仅仅包括ae.c.ae.h,还有3个不同的多路复用(本文仅描述epoll)的wrapper文件,事件库封 ...
- C#-委托 lambda 匿名方法 匿名类型
1.lambda 匿名方法 匿名类型 delegate void d1(); d1 d = delegate(){Console.WriteLine("this is a test" ...
- Oracle在更改机器名后服务无法启动的解决方法
Oracle改变机器名后会导致服务无法正常启动,能够通过下列操作解决: 1.oracle\product\10.2.0\db_3\network\ADMIN文件夹下,listener.ora文件里的L ...