题解:

刷了一天的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. 如何将DJANGO轻量级化

    看看这本书,应该有收获. 不用DJANGO-ADMIN STARTPROJECT XXX 一个文件,一样可以写出可以运行的原生DJANGO哟. import hashlib import sys im ...

  2. FreeMarker 乱码解决方案 生成静态html文件

    读取模板的时候有一个编码: Template template = this.tempConfiguration.getTemplate(templatePath,"UTF-8") ...

  3. 使用Data Annotations进行手动数据验证

    Data Annotations是在Asp.Net中用于表单验证的 它通过Attribute直接标记字段的有效性,简单且直观.在非Asp.Net程序中(如控制台程序),我们也可以使用Data Anno ...

  4. boost库在windows下的编译和使用

    因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...

  5. 面试大总结:Java搞定面试中的链表题目总结

    package LinkedListSummary; import java.util.HashMap; import java.util.Stack; /** * http://blog.csdn. ...

  6. Subversion安装和使用

    Subversion(SVN)是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说.SVN分为客户端和服务器端,一般服务器端安装在服务器上,我们开发者用的都是客户端.TortoiseSVN是 ...

  7. Hadoop分布式文件系统(HDFS)详解

    HDFS简介: 当数据集的大小超过一台独立物理计算机的存储能力时,就有必要对它进行分区 (partition)并存储到若干台单独的计算机上.管理网络中跨多台计算机存储的文件系统成为分布式文件系统 (D ...

  8. 在vs2010中mfc,C++的一些小经验

    1 如果你最近才从vc6.0到vs2010,在vs2010中mfc可能遇见一个小问题,如果你添加或改天了窗口中的控件,运行程序缺没有发现其中的变化,这时候需要在debug选项中rebuild all一 ...

  9. 深入理解jvm

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝 ...

  10. devfs,proc,udev

    devfs:常用的驱动函数封装 proc:在用户态检查内核状态的机制 udev 和 devfs相比? 一个是用户空间里的,一个运行在内核空间且被2.6以后版本抛弃了