题目:洛谷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游戏的更多相关文章

  1. [NOIP2011] 提高组 洛谷P1312 Mayan游戏

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  2. 刷题总结——mayan游戏(NOIP2011提高组day2T3)

    题目: 题目背景 NOIP2011提高组 DAY1 试题. 题目描述 Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个 7 行 5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  3. Noip2011 提高组 Day1 T3 Mayan游戏

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  4. 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏

    Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...

  5. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  6. [NOIP2011] 提高组 洛谷P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  7. [NOIP2011] 提高组 洛谷P1003 铺地毯

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  8. NOIP2011(提高组)DAY2---观光公交(vijosP1741)

    描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景 ...

  9. 洛谷-铺地毯-NOIP2011提高组复赛

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

随机推荐

  1. Qwiklab'实验-API Gateway, AWS Lambda'

    title: AWS之Qwiklab subtitle: 2. Qwiklab'实验-API Gateway, AWS Lambda' date: 2018-09-20 17:29:20 --- In ...

  2. Oracle的分页查询及内联视图和函数处理

    1.Oracle的分页常用方式: select * from(select * ,ROWNUM num from table where ROWNUM<=20 ) where num>0; ...

  3. HDU 2095 find your present (2)( 位运算 )

    链接:传送门 题意:给出n个数,这n个数中只有一种数出现奇数次,其他全部出现偶数次,让你找到奇数次这个数 思路:简单异或运算题 /*********************************** ...

  4. 51nod-字符串连接

    输入n个字符串s[i],你要把他们按某个顺序连接起来,使得字典序最小. (1 <= n <= 100) (每个字符串长度 <= 100) (字符串只包含小写字母) Input 第一行 ...

  5. BZOJ 1492 [NOI2007]货币兑换Cash (CDQ分治/splay 维护凸包)

    题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易 ...

  6. nysql数据库优化

    硬件优化 软件优化 my.cnf参数优化,命令监控show global status\G 调优工具mysqlreport sql语句优化 索引的优化 白名单机制--百度,就是让一些不规范的语句执行查 ...

  7. PHP实现的毫秒定时器,同时解决进程不重复堆积

    定时器任务,在WEB应用比较常见,如何使用PHP实现定时器任务,大致有两种方案:1)使用Crontab命令,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本:2)配合使用ignore_ ...

  8. Python-基础-day6

    1.二进制 前言:计算机一共就能做两件事:计算和通信 2.字符编码 生活中的数字要想让计算机理解就必须转换成二进制.十进制到二进制的转换只能解决计算机理解数字的问题,那么文字要怎么让计算机理解呢? 于 ...

  9. pytorch 4 regression 回归

    import torch import torch.nn.functional as F import matplotlib.pyplot as plt # torch.manual_seed(1) ...

  10. 使用uglifyjs压缩JS

    一般vue项目完成打包以后需要优化,特别是首次打开加载速度们,webpack打包以后js文件体积很大等方法,可以用这个方法来压缩js文件 安装node.js 安装当前应用 -- uglifyjs 如何 ...