集训·Mayan游戏

#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n,mp[N][N],u,ansx[N],ansy[N],ansd[N];
inline void confirm()
{
	bool flag=true;
	for(int i=1;i<=5;i++)if(mp[i][1])flag=false;
	if(flag)for(int i=1;i<=n;i++)
	cout<<ansx[i]-1<<" "<<ansy[i]-1<<" "<<ansd[i]<<endl; 
	if(flag)exit(0);
}
inline bool xiao()
{
	bool xi[N][N],flag=false;
	memset(xi,0,sizeof(xi)); 
	for(int i=1;i<=5;i++)for(int j=1;mp[i][j];j++)
	{
		int r;
		for(r=i+1;r<=5;r++)if(mp[i][j]!=mp[r][j])break;
		if(r-i>=3)for(int k=i;k<r;k++)xi[k][j]=true;
		for(r=j+1;r<=7;r++)if(mp[i][j]!=mp[i][r])break;
		if(r-j>=3)for(int k=j;k<r;k++)xi[i][k]=true;
	}
	for(int i=1;i<=5;i++)for(int j=1;j<=7;j++)
	if(xi[i][j])mp[i][j]=0,flag=true;
	if(!flag)return false;
	for(int i=1;i<=5;i++)for(int j=1;j<=7;j++)
    if(!mp[i][j])
	{ 
        int k=j+1;
        for(;k<=7;k++)if(mp[i][k])break;
        mp[i][j]=mp[i][k];mp[i][k]=0;
    }
	return true;
}
inline void dfs(int now)
{
	for(int i=1;i<=5;i++)for(int j=1;mp[i][j];j++)
	{
		if(i!=5&&mp[i][j]!=mp[i+1][j]&&mp[i+1][j])
		{
			int tp[N][N];
			memcpy(tp,mp,sizeof(tp));
			swap(mp[i][j],mp[i+1][j]);
			ansx[now]=i;ansy[now]=j;ansd[now]=1;
			while(xiao()){}
			if(now==n)confirm();
			else dfs(now+1);
			memcpy(mp,tp,sizeof(mp));
		}
		if(i!=5&&!mp[i+1][j])
		{
			int tp[N][N];
			memcpy(tp,mp,sizeof(tp));
			int k;
            for(k=j-1;k>=1;k--)if(mp[i+1][k])break;
        	mp[i+1][++k]=mp[i][j];mp[i][j]=0;
        	for(int e=j;e<=6;e++)
			{mp[i][e]=mp[i][e+1];mp[i][e+1]=0;} 
			ansx[now]=i;ansy[now]=j;ansd[now]=1;
			while(xiao()){}
			if(now==n)confirm();
			else dfs(now+1);
			memcpy(mp,tp,sizeof(mp));
		}
		if(i!=1&&!mp[i-1][j])
		{
			int tp[N][N];
			memcpy(tp,mp,sizeof(tp));
			int k;
            for(k=j-1;k>=1;k--)if(mp[i-1][k])break;
            mp[i-1][++k]=mp[i][j];mp[i][j]=0;
            for(int e=j;e<=6;e++)
			{mp[i][e]=mp[i][e+1];mp[i][e+1]=0;} 
			ansx[now]=i;ansy[now]=j;ansd[now]=-1;
			while(xiao()){}
			if(now==n)confirm();
			else dfs(now+1);
			memcpy(mp,tp,sizeof(mp));
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=5;i++)
	{
		int tmp=0;
		while(cin>>u){if(!u)break;mp[i][++tmp]=u;}
	}
	dfs(1);
	cout<<-1<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/Ace-MYX/p/11678639.html