[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 .现在将这些地毯按照编号从小到大的顺序平行于 ...
随机推荐
- 【BZOJ3309】DZY Loves Math - 莫比乌斯反演
题意: 对于正整数n,定义$f(n)$为$n$所含质因子的最大幂指数.例如$f(1960)=f(2^3 * 5^1 * 7^2)=3$,$f(10007)=1$,$f(1)=0$. 给定正整数$a,b ...
- 关于Number的属性和方法你知晓几分?速来围观!
1.Number.isFinite() 方法用来检测传入的参数是否是一个有穷数(finite number)返回值为布尔值. 和全局的 isFinite() 函数相比,这个方法不会强制将一个非数值的参 ...
- 使用python备份指定目录并删除备份超过一定时长的文件
#!/usr/bin/env python #-*- coding: utf-8 -*- """ @Project:Py @author: @Email: @Softwa ...
- 光盘文件的挂载和yum源配置
一.挂载光盘文件 1.将光盘推入 2.新建挂载点 mkdir /mnt/cdrom 3.挂载 3.1临时挂载 mount /dev/dcrom /mnt/cdrom 或者 mount –t iso ...
- python_形参、实参
#参数:形参.实参'''def display_message(title): print("My favourite book is %s" %title) #return 0 ...
- 小学生都能学会的python(字典{ })
小学生都能学会的python(字典{ }) 1. 什么是字典 dict. 以{}表示. 每一项用逗号隔开, 内部元素用key:value的形式来保存数据 {"jj":"林 ...
- LeetCode 11. Container With Most Water 单调队列
题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...
- centos7下部署FastDFS分布式文件系统
前言 项目中用到文件服务器,有朋友推荐用FastDFS,所以就了解学习了一番,感觉确实颇为强大,在此再次感谢淘宝资深架构师余庆大神开源了如此优秀的轻量级分布式文件系统,本篇文章就记录一下FastDFS ...
- 【codeforces 747E】Comments
[题目链接]:http://codeforces.com/problemset/problem/747/E [题意] 给你一个类似递归的结构; 让你把每一层的字符串按照层,一层层地输出出来; 并输出层 ...
- ASP.NET-表单验证-DataAnnotations
DataAnnotations [数据注解,数据注释] 需要引入两个脚本文件 <script src="@Url.Content("~/Scripts/jquery.val ...