[NOIP2011]Mayan游戏 题解
题目大意:
有一个5*7的方格,上面有几种颜色的方块,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除,方块消除之后,消除位置之上的方块将掉落。每步移动可以且仅可以沿横向拖动某一方块一格:当拖动这一方块时,如果拖动后到达的目标位置也有方块,那么这两个方块将交换位置;如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落,直到不悬空。输入一个正整数n ,表示要求游戏通关的步数,输出方案(多组解时,按照 x 为第一关健字,y 为第二关健字,1优先于-1 ,给出一组字典序最小的解)
思路:
因为n小于等于5,因此按字典序搜索方案,移动后按要求模拟(全零的要注意),减枝为若要移动的方块左侧不为空则该方案不是最优,可以舍去。
代码:(太丑陋了)
#include<cstdio>
#include<cstring>
using namespace std;
#define copy(x,y) memcpy(x,y,sizeof(x))
#define sousuo x[k]=i,y[k]=j,dfs(k+1),tot=t,copy(map,a),copy(hight,b)
int map[][],hight[],x[],y[],z[],ansx[],ansy[],ansz[],i,n,tot,k;
bool flag; void wk(int x,int y,int z)
{
int i,c[][];
if (map[z][y]) i=map[x][y],map[x][y]=map[z][y],map[z][y]=i;
else
{
map[z][hight[z]++]=map[x][y];
for (;y<hight[x];y++) map[x][y]=map[x][y+];
map[x][hight[x]--]=;
}
for (bool f=;f;)
{
f=;
memset(c,,sizeof(c));
for (i=;i<;i++)
for (x=y=;y<=hight[i];)
if (map[i][x]==map[i][y]) y++;
else
{
if (y-x>) for (f=;x<y;x++) c[i][x]=;
x=y;
}
for (i=;i<;i++)
for (x=y=;y<;)
if (map[x][i]==map[y][i]) y++;
else
{
if (y-x> && map[x][i]) for (f=;x<y;x++) c[x][i]=;
x=y;
}
for (i=;i<;i++)
{
for (x=y=;y<hight[i];)
{
while (c[i][y]) y++,tot--;
if (y==hight[i]) break;
map[i][x++]=map[i][y++];
}
for (y=x;y<;y++) map[i][y]=;
hight[i]=x;
}
}
} void dfs(int k)
{
if (flag) return;
if (k>n)
{
if (!tot) flag=,copy(ansx,x),copy(ansy,y),copy(ansz,z);
return;
}
if (!tot) return;
int a[][],b[],t=tot;
copy(a,map),copy(b,hight);
for (int i=;i<;i++)
for (int j=;j<b[i];j++)
{
if (i<) wk(i,j,i+),z[k]=,sousuo;
if (i && !a[i-][j]) wk(i,j,i-),z[k]=-,sousuo;//jianzhi
}
} int main()
{
scanf("%d",&n);
for (i=;i<;i++)
for (scanf("%d",&k);k;scanf("%d",&k)) map[i][hight[i]++]=k;
for (i=;i<;i++) tot+=hight[i]; dfs();
if (flag) for (i=;i<=n;i++) printf("%d %d %d\n",ansx[i],ansy[i],ansz[i]);
else printf("-1");
return ;
}
[NOIP2011]Mayan游戏 题解的更多相关文章
- luoguP1312 Mayan游戏 题解(NOIP2011)
luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...
- NOIP2011 Mayan游戏
3 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上 ...
- [NOIP2011] mayan游戏(搜索+剪枝)
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...
- Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝
写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
- $Mayan$游戏
\(Mayan\)游戏 好啊,一年(半年)来的梦魇,终于结束了. 其实我从来没料到整体竟然会如此暴力--做的时候机房里冷得很,感觉晕晕乎乎地做完了,晕晕乎乎地调了好久,晕晕乎乎地听(看了题解的)\(q ...
- 洛谷P1312 Mayan游戏
P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...
- Luogu P1312 Mayan游戏(搜索)
P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...
- NOIP2011玛雅游戏
闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...
随机推荐
- SVN和Git下载地址
SVN: TortoiseSVN:https://tortoisesvn.net/downloads.html (安装包和语言) Git: Git for Windows:https://git-fo ...
- mysql问题
mysql x64,由于没有msi版,因此,在使用上可能会出现一些问题. 一. 配置环境变量: 只需把mysql/bin文件夹地址完整地添加到Path中,用“;”与前面的参数隔开.需注意,mysql ...
- SSH Junit4测试
package test; import static org.junit.Assert.*; import java.util.List; import org.hibernate.SessionF ...
- 什么叫session和cookie-及其设置
http的无状态? 保持状态, 是指当程序关闭后重启, 上一次操作的历史还能继续, 保持的. 如word中的 "选项"设置. 如windows系统的设置等等. http的设计目的, ...
- Node+Express+node-mysql 实战于演习 全套mysql(增删改查)
最近这段时间研究Node感觉不错,自己做了一个增删改查,虽然有些简陋,但是思想是想通的,其实所有项目都是增删改查,有助于初学者快速掌握Node 首先 本实例展示的是基于Node+Express+nod ...
- 短信接口API
/** * Created by bingone on 15/12/16. */ import org.apache.http.HttpEntity; import org.apache.http.N ...
- javascript数据结构-队列
gihub博客地址 队列(Queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...
- BZOJ 1131: [POI2008]Sta
Description 一棵树,问以那个节点为根时根的总和最大. Sol DFS+树形DP. 第一遍统计一下 size 和 d. 第二遍转移根,统计答案就行了. Code /************* ...
- servlet 之 response 回复 字节流 字符流
重定向 设置状态吗为302 添加响应头Location(告诉他重定向到哪里去) //response.setStatus(302); //添加响应头Locatio ...
- java20
1:递归(理解) (1)方法定义中调用方法本身的现象 举例:老和尚给小和尚讲故事,我们学编程 (2)递归的注意事项: A:要有出口,否则就是死递归 B:次数不能过多,否则内存溢出 C:构造方法不能递归 ...