[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玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...
随机推荐
- thinkphp语言包
1.config.php语言包相关配置. //开启语言包 'LANG_SWITCH_ON' => true, 'LANG_AUTO_DETECT' => true, // 自动侦测语言 开 ...
- 设置arc 的默认编辑器
arc set-config editor "vim" 转自:http://udn.yyuap.com/thread-39791-1-1.html Pharicator是FB的代码 ...
- 大熊君{{bb}}移动开发之旅(第一季)
一,开篇概述 Hi,大家好!大熊君又和大家见面了,从这篇文章开始我要和大家聊聊移动开发的话题,这部分文章共8季,分别从不同角度来讲解什么是移动开发?移动开发涉及到什么方面的技术点以及移动开发中的常见问 ...
- codevs2645 Spore
题目描述 Description 某陈和某Y 最近对一个游戏着迷.那是Electronic Arts 今年发布的优秀的模拟经营类游戏,Spore. 在Spore 中,玩家将经历从单细胞生物到星系的统治 ...
- 微信 5.3 for iPhone已放出 微信iphone版更新下载
就在几个小时前,微信发布了更新,本次只放出微信 5.3 for iPhone,距离发布微信5.3内测版也就几天时间.和往常一样微信iphone版先发布,微信android版延后发布,微信看重的是ios ...
- 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等
添加水印,并且增加权限 @Test public void addWaterMark() throws Exception{ String srcFile="D:\\work\\pdf\\w ...
- JDBC连接数据库演示案例
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...
- 【原创】js中input type=file的一些问题
1.介绍 在开发中,文件上传必不可少,input[type=file] 是常用的上传标签,但是它长得又丑.浏览的字样不能换,但是他长得到底有多丑呢.我们来看看在不同浏览器里的样子吧. <inpu ...
- 一行实现QQ群组头像,微信群组,圆角等效果. 并支持url直接加载图片
说点题外话. Coding中我们总是经历着这么几个过程. 学会使用: 不管是API也好, 开源库也好. 总是在最开始的学会去用. 了解实现原理: 可能会因为一些不兼容, 代码的异常状态的处理不够完美等 ...
- node02-util
目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-exp ...