【解题报告】洛谷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;
}
posted @ 2021-10-14 20:02  wweiyi  阅读(33)  评论(0编辑  收藏  举报
js脚本