[NOIP2011] 玛雅游戏
来源:互联网 发布:php求和函数 编辑:程序博客网 时间:2024/06/05 22:53
问题 A: [NOIP2011] 玛雅游戏
时间限制: 3 Sec 内存限制: 128 MB提交: 73 解决: 25
[提交][状态][讨论版]
题目描述
1、 每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见下面图1 和图2);
2、 任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1 到图3)。
注意:
a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图4,三个颜色为1 的方块和三个颜色为2 的方块会同时被消除,最后剩下一个颜色为2 的方块)。
b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5 所示的情形,5 个方块会同时被消除)。
3、 方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意:掉落的过程中将不会有方块的消除。
上面图1 到图3 给出了在棋盘上移动一块方块之后棋盘的变化。棋盘的左下角方块的坐标为(0, 0),将位于(3, 3)的方块向左移动之后,游戏界面从图1 变成图2 所示的状态,此时在一竖列上有连续三块颜色为4 的方块,满足消除条件,消除连续3 块颜色为4 的方块后,上方的颜色为3 的方块掉落,形成图3 所示的局面。
输入
第一行为一个正整数n,表示要求游戏通关的步数。
接下来的5 行,描述7*5 的游戏界面。每行若干个整数,每两个整数之间用一个空格隔开,每行以一个0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于10 种,从1 开始顺序编号,相同数字表示相同颜色)。
输入数据保证初始棋盘中没有可以消除的方块。
输出
如果没有解决方案,输出一行,包含一个整数-1。
样例输入
31 02 1 02 3 4 03 1 02 4 3 4 0
样例输出
2 1 13 1 13 0 1
提示
按箭头方向的顺序分别为图6 到图11
样例输入的游戏局面如上面第一个图片所示,依次移动的三步是:(2,1)处的方格向右移动,(3,1)处的方格向右移动,(3,0)处的方格向右移动,最后可以将棋盘上所有方块消除。
【数据范围】
对于30%的数据,初始棋盘上的方块都在棋盘的最下面一行;
对于100%的数据,0 < n≤5。
玛雅游戏:
算法分析:dfs
1.主函数:读入数据,并判断dfs中是否找到解,没找到输出-1。
2.dfs:对7?5中每个非0的点按照x从小到大,y从小到大,先右后左进行枚举,注意右边界点不能向右,左边界点不能向左,枚举时调用move函数并记录相应操作;每次枚举前要把原来的矩阵copy一份,便于回溯;当超过n时,判断是否为空,如果为空就输出记录的操作。
3.move:首先是交换两个变量的位置,调用时用一个记号记录是向左还是向右。然后调用fall函数、wipe函数(消块)。注意,如果wipe函数生效,则要对所有点重新调用fall函数和wipe函数,直到wipe函数中没有消掉任何块。
4.fall:判断该点下方是否有0,如果有0就向下移,反之则无。
5.wipe:按横和纵两种情况,判断是否是超过3个同样的颜色连接在一起,如果有就标记它们为true。需要注意,等所有点都判断完再消去,防止一个点被用两次的情况。
爆爆
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<set>
#include<deque>
#include<cstdlib>
#include<algorithm>
#define V 500005
#define LL long long
using
namespace
std;
int
n,mod;
int
yu;
int
s[5][7],sd[25];
int
t[100][10],st;
int
sx,sy,sf;
inline
int
check()
{
for
(
int
i=0;i<=4;i++)
for
(
int
j=0;j<=6;j++)
if
(s[i][j])
{
return
0;
}
return
1;
}
inline
void
fall(
int
i)
{
int
hh;
for
(
int
j=0;j<=6;j++)
{
if
(s[i][j]==0)
{
for
(
int
p=j+1;j<=6&&p<=6;p++)
if
(s[i][p]&&!s[i][j])
{
hh=s[i][p];
s[i][p]=0;
s[i][j]=hh;
j++;
}
// s[i][j-1]=s[i][j];
//s[i][j]=0;
}
}
}
inline
int
wipe()
{
bool
xx[5][7]={0};
int
vis=0;
for
(
int
i=0;i<=4;i++)
{
for
(
int
j=0;j<=6;j++)
{
if
(i>0&&i<4)
{
if
(s[i-1][j]==s[i][j]&&s[i+1][j]==s[i][j]&&s[i][j]!=0)
{
xx[i-1][j]=xx[i][j]=xx[i+1][j]=1;
vis=1;
}
}
if
(j>0&&j<6)
{
if
(s[i][j-1]==s[i][j]&&s[i][j]==s[i][j+1]&&s[i][j]!=0)
{
xx[i][j-1]=xx[i][j]=xx[i][j+1]=1;
vis=1;
}
}
}
}
for
(
int
i=0;i<=4;i++)
{
for
(
int
j=0;j<=6;j++)
if
(xx[i][j])
{
s[i][j]=0;
}
fall(i);
}
return
vis;
}
inline
void
move(
int
x,
int
y,
int
a,
int
b)
{
int
zz;
zz=s[a][b];
s[a][b]=s[x][y];
s[x][y]=zz;
fall(x);
fall(a);
while
(wipe())
{
}
}
inline
void
dfs(
int
x)
{
sx=x;
if
(x==n)
{
if
(!check())
return
;
for
(
int
i=1;i<=n;i++)
cout<<t[i][0]<<
" "
<<t[i][1]<<
" "
<<t[i][2]<<endl;
exit
(0);
}
int
g[5][7],f[5][7];
memcpy
(g,s,
sizeof
(g));
for
(
int
i=0;i<=4;i++)
for
(
int
j=0;j<=6;j++)
{
if
(i<4&&s[i][j]&&s[i][j]!=s[i+1][j])
{
move(i,j,i+1,j);
t[0][0]++;
t[t[0][0]][0]=i;
t[t[0][0]][1]=j;
t[t[0][0]][2]=1;
dfs(x+1);
memcpy
(s,g,
sizeof
(s));
t[0][0]--;
}
if
(i>0&&s[i][j]&&s[i][j]!=s[i-1][j]&&s[i-1][j]==0)
{
t[0][0]++;
t[t[0][0]][0]=i;
t[t[0][0]][1]=j;
t[t[0][0]][2]=-1;
move(i,j,i-1,j);
dfs(x+1);
memcpy
(s,g,
sizeof
(s));
t[0][0]--;
}
}
}
inline
int
haha()
{
//freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
// freopen("mayan.in","r",stdin); //freopen("mayan.out","w",stdout);
cin>>n;
int
x;
int
pp=0;
for
(
int
i=0;i<=4;i++)
{
for
(
int
j=0;j<=7;j++)
{
cin>>x;
if
(x==0)
break
;
s[i][j]=x;
sd[x]++;
sd[0]=max(x,sd[0]);
}
}
dfs(0);
if
(!t[0][0])cout<<-1<<endl;
//cout<<t[0][0]<<endl;
}
int
gg=haha();
int
main()
{;}
- dfs NOIP2011] 玛雅游戏
- [NOIP2011] 玛雅游戏(回溯)
- [NOIP2011] 玛雅游戏
- 【NOIP2011】玛雅游戏
- noip2011 玛雅游戏 大模拟
- 【NOIP2013】Day1T3 玛雅游戏
- NOIP玛雅游戏
- [NOIP2011]Mayan游戏【搜索】
- NOIP2011 Mayan游戏(搜索)
- 【CodeVS1136】【NOIP2011】Mayan 游戏
- NOIP2011 Mayan游戏 题解
- 【NOIP2011】Mayan游戏 搜索
- NOIP2011 Mayan游戏
- NOIP2011【Mayan游戏】
- NOIP2011 Mayan游戏
- noip2011 Mayan游戏
- 【NOIP2011】【DFS】Mayan游戏
- 玛雅游戏!!!!(爆搜!!神代码题)
- Linux软件管理-RPM和YUM作用与关系
- 欧拉函数
- ImportError: No module named model_libs
- Java中的集合框架
- How Many Equations Can You Find
- [NOIP2011] 玛雅游戏
- 欧拉函数
- Codeforces Round #426 (Div. 2)
- spring&velocity>velocityEngine
- CardView使用详解
- 每日工作计划
- hdu 3037 Saving beans 卢卡斯定理
- hibernate的事物隔离级别和传播特性
- HTML 5 本地存储----LocalStorage 小DEMO