【noip2011】Mayan游戏
题解:
刷了一天的noip啊 做了10题! 突然找回了做马拉松的感觉- -
我中午竟然放弃治疗去看视频 做到晚上累得都快挂了 用电脑放一些rock 把音乐当咖啡硬撑下来 但是还是没能刷3届
唉 显然速度刷题是很容易忘的 简单写一些题解 然后睡觉去(- -。zZ)
赤裸裸的搜索 但是要加一些剪枝
1.如果交换的两个方块颜色相同则不换
2.如果移动时是向左且左边有方块则不动(左边的往右效果一样)
3.如果任意颜色发方块个数为1或2 显然无解return
我只加了这些剪枝速度貌似还不错 vijos上1300ms左右
关键是很多人说这题很复杂 - -?
其实思路清楚就不会(表示半小时搞定) 我感觉做这题就像在做游戏一样
可以写两个函数fall 和clean做掉落和清除 然后在要调用的地方写函数就会觉得清晰多了
代码:
#include <cstdio>
#include <cstdlib>
struct info{
int a[][];
void print(){
for (int i=;i>=;i--){
for (int j=;j<=;j++) printf("%d ",a[j][i]);
puts("");
}
puts("");
}
}now,save[];
int n,rem[],srem[][],ans[][],bo[][];
void swap(int &a,int &b){ int x=a; a=b,b=x; }
void fall(){
for (int i=;i<=;i++)
for (int j=;j<=;j++)
if (!now.a[i][j-] && now.a[i][j]){
int k;
for (k=j-;!now.a[i][k] && k>=;--k);
++k;
swap(now.a[i][j],now.a[i][k]);
}
}
void markbo(){
for (int i=;i<=;i++)
for (int j=;j<=;j++)
if (now.a[i][j]){
if (now.a[i-][j]==now.a[i][j] && now.a[i+][j]==now.a[i][j]){
bo[i-][j]=;
bo[i][j]=;
bo[i+][j]=;
}
if (now.a[i][j-]==now.a[i][j] && now.a[i][j+]==now.a[i][j]){
bo[i][j-]=;
bo[i][j]=;
bo[i][j+]=;
}
}
}
bool clean(){
markbo();
int res=;
for (int i=;i<=;i++)
for (int j=;now.a[i][j] && j<=;j++)
if (bo[i][j]){
res=;
bo[i][j]=;
--rem[now.a[i][j]];
now.a[i][j]=;
}
return res;
}
int work(int x,int y,int z){
swap(now.a[x][y],now.a[x+z][y]);
fall();
while (clean()) fall();
int res=;
for (int i=;i<=;i++)
if (rem[i])
if (!res || res>rem[i]) res=rem[i];
return res;
}
void print(){
for (int i=;i<=n;i++)
printf("%d %d %d\n",ans[i][]-,ans[i][]-,ans[i][]);
exit();
}
void search(int t){
//printf("%d:\n",t);
//now.print();
save[t]=now;
for (int i=;i<=;i++) srem[t][i]=rem[i];
for (int i=;i<=;i++)
for (int j=;now.a[i][j] && j<=;j++)
for (int k=;k>=-;k-=)
if (i+k> && i+k<=){
if ((k==- && now.a[i-][j]) || now.a[i][j]==now.a[i+k][j]) continue;
ans[t][]=i,ans[t][]=j,ans[t][]=k;
int x=work(i,j,k);
if (t==n){
if (x==) print();
}else if (x>) search(t+);
now=save[t];
for (int l=;l<=;l++) rem[l]=srem[t][l];
}
}
int main(){
scanf("%d",&n);
for (int x,i=;i<=;i++)
while (scanf("%d",&x),x){
now.a[i][++now.a[i][]]=x;
++rem[x];
}
for (int i=;i<=;i++) now.a[i][]=;
search();
puts("-1");
}
【noip2011】Mayan游戏的更多相关文章
- NOIP2011 Mayan游戏
3 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上 ...
- [NOIP2011] mayan游戏(搜索+剪枝)
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...
- [NOIP2011]Mayan游戏 题解
题目大意: 有一个5*7的方格,上面有几种颜色的方块,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除,方块消除之后,消除位置之上的方块将掉落.每步移动可以且仅可以沿横向 ...
- Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝
写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
- luoguP1312 Mayan游戏 题解(NOIP2011)
luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...
- 洛谷P1312 Mayan游戏
P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...
- Luogu P1312 Mayan游戏(搜索)
P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...
- NOIP2011玛雅游戏
闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...
- noip提高组2011 Mayan游戏
Mayan游戏 描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关 ...
随机推荐
- List<T> 排序
List<T>的排序 List<DataPoint> dataPointsDataPints = ...; //按RegisterAddress升序排序 dataPointsD ...
- IDFA问题,苹果上传问题。improper Advertising identifier [IDFA] Usage.
原地址: 报告 improper Advertising identifier [IDFA] Usage. Your app contains the Advertising Identifier [ ...
- IOS 录像软件
http://iphone.91.com/tutorial/cjjc/140430/21683219.html
- hdu 2509 Be the Winner 博弈论
博弈论水题!!! 代码如下: #include<stdio.h> #include<iostream> using namespace std; int main(){ int ...
- VC++的文件格式详解
.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度.资源辅助文件. .BMP:位图资源文件. .BSC:浏览信息文件,由浏览信息维护工具( ...
- Android四大基本组件
Android四大基本组件分别是 Activity:整个应用程序的门面,负责与用户进行交互. Service:承担大部分工作. Content Provider内容提供者:负责对外提供数据,并允许需要 ...
- C#基础精华03(常用类库StringBuilder,List<T>泛型集合,Dictionary<K , V> 键值对集合,装箱拆箱)
常用类库StringBuilder StringBuilder高效的字符串操作 当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作. String 对象是不可变的. 每次使用 System. ...
- 最短路径算法之一——Floyd算法
Floyd算法 Floyd算法可以用来解决任意两个顶点之间的最短路径问题. 核心公式为: Edge[i][j]=Min{Edge[i][j],Edge[i][k]+Edge[k][j]}. 即通过对i ...
- android的休眠和唤醒流程
android休眠唤醒流程: power按键事件上报给android系统,最终由windownmanager接收到,当有按键事件时判断是否需要休眠后唤醒系统,然后调用powermanager系统服务去 ...
- 统计 p-value 含义
p-value是一种概率:在原假设为真的前提下,出现该样本或比该样本更极端的结果的概率之和. 例子: 我们假设 H0:出现正面的概率是1/2 扔硬币20次出现了14次正面.该样本的单边p-value计 ...