【解题报告】洛谷P1312 Mayan游戏
【解题报告】洛谷P1312 Mayan游戏
题目链接
https://www.luogu.com.cn/problem/P1312
思路
直接大模拟
考虑每次向左向右移动,然后对于每次移动做出相应的操作,更改地图
在地图更改之前保存一个副本
然后对于每一个方块,我们进行一次搜索,每个方块向左向右移动
然后我们移动完了之后模拟重力,然后将方块全都落下来
然后消除应该消除的方块
同理继续搜索
每次搜索完了之后,应该回溯到之前的状态,方便之后的搜索
然后就是大模拟了,我干了一个半小时什么都没赶出来草
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int maxn=10;
struct movement{
int x,y,dir;
}sol[maxn];
int n;
int m[maxn][maxn];
int lst[maxn][maxn][maxn];
int cla[maxn][maxn];
bool clear()
{
bool flag=false;
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
{
if(i-1>=1&&i+1<=5&&m[i][j]==m[i-1][j]&&m[i][j]==m[i+1][j]&&m[i][j])
cla[i-1][j]=cla[i+1][j]=cla[i][j]=flag=1;
if(j-1>=1&&j+1<=7&&m[i][j]==m[i][j+1]&&m[i][j]==m[i][j-1]&&m[i][j])
cla[i][j-1]=cla[i][j+1]=cla[i][j]=flag=1;
}
}
if(!flag) return false;
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
{
if(cla[i][j])
cla[i][j]=m[i][j]=0;
}
}
return true;
}
bool check()
{
for(int i=1;i<=5;i++)
if(m[i][1])
return false;
return true;
}
void copy(int x)
{
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
lst[x][i][j]=m[i][j];
}
}
void gravity()
{
for(int i=1;i<=5;i++)
{
int tmp=0;
for(int j=1;j<=7;j++)
{
if(!m[i][j]) tmp++;
else
{
if(!tmp) continue;
m[i][j-tmp]=m[i][j];
m[i][j]=0;
}
}
}
}
void move(int i,int j,int x)
{
int tmp=m[i][j];
m[i][j]=m[i+x][j];
m[i+x][j]=tmp;
gravity();
while(clear())
gravity();
}
void dfs(int x)
{
if(check())
{
for(int i=1;i<=n;i++)
{
cout<<sol[i].x<<" "<<sol[i].y<<" "<<sol[i].dir;
cout<<'\n';
}
exit(0);
}
if(x==n+1) return ;
copy(x);
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
{
if(m[i][j])
{
if(i+1<=5&&m[i][j]!=m[i+1][j])
{
move(i,j,1);
sol[x].x=i-1,sol[x].y=j-1,sol[x].dir=1;
dfs(x+1);
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
m[i][j]=lst[x][i][j];
sol[x].x=sol[x].y=sol[x].dir=-1;
}
}
}
if(i-1>=1&&m[i-1][j]==0)
{
move(i,j,-1);
sol[x].x=i-1,sol[x].y=j-1,sol[x].dir=-1;
dfs(x+1);
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
m[i][j]=lst[x][i][j];
}
sol[x].x=sol[x].y=sol[x].dir=-1;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=5;i++)
{
for(int j=1;j<=8;j++)
{
int x;
cin>>x;
if(x==0) break;
m[i][j]=x;
}
}
memset(sol,0,sizeof(sol));
dfs(1);
cout<<-1<<'\n';
return 0;
}
本博文为wweiyi原创,若想转载请联系作者,qq:2844938982