题解:

刷了一天的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游戏的更多相关文章

  1. NOIP2011 Mayan游戏

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

  2. [NOIP2011] mayan游戏(搜索+剪枝)

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

  3. [NOIP2011]Mayan游戏 题解

    题目大意: 有一个5*7的方格,上面有几种颜色的方块,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除,方块消除之后,消除位置之上的方块将掉落.每步移动可以且仅可以沿横向 ...

  4. Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝

    写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...

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

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

  6. luoguP1312 Mayan游戏 题解(NOIP2011)

    luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...

  7. 洛谷P1312 Mayan游戏

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

  8. Luogu P1312 Mayan游戏(搜索)

    P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...

  9. NOIP2011玛雅游戏

    闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...

  10. noip提高组2011 Mayan游戏

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

随机推荐

  1. discuz云平台报调用远程接口失败的问题分析和解决

    根据网络两篇文章整理 问题描述:当开通或关闭某个云平台服务的时候,报如下错误信息:调用远程接口失败.请检查您的服务器是否处于内网以及您服务器的防火墙设置. 云平台测试站点的接口文件正常,于是开始在文件 ...

  2. Shell命令合集

    Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号 cd 回到起始目录,也即刚登陆到系统的目录,cd后面无参数cd ...

  3. Side by Side Assembly介绍--manifest文件的使用

    什么是Side-by-Side Assembly? Side-by-Side Assembly(建称SxS)是微软在Visual Studio 2005(Windows 2000?)中引入的技术,用来 ...

  4. linux ubuntu卸载软件

    1.通过deb包安装的情况: 安装.deb包: 代码:sudo dpkg -i package_file.deb反安装.deb包: 代码:sudo dpkg -r package_name 2.通过a ...

  5. Nginx开启Gzip压缩大幅提高页面加载速度(转)

    转自:http://www.cnblogs.com/mitang/p/4477220.html 刚刚给博客加了一个500px相册插件,lightbox引入了很多js文件和css文件,页面一下子看起来非 ...

  6. Maven打包时囊括本地依赖的jar包

    在开发中,偶尔会遇到一个问题:某些比较冷门的包,maven服务器上没有,而我们又必须用,通常情况下会在项目中建立一个lib文件夹.将这些包copy进去并加入buildpath,开发就可以继续了,如下图 ...

  7. 函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

    最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http ...

  8. C#基础精华04(文件流,文件操作,File、Directory、Path,Directory)

    文件流 FileStream  可读可写  大文件  释放 StreamReader 读取   释放 StreamWriter 写入   释放 using 中释放 File 可读可写  小文件 操作文 ...

  9. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  10. 完全掌握Android Data Binding

    转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html 来源 https://github.com/L ...