蒟蒻求助
查看原帖
蒟蒻求助
362167
b1468821672楼主2022/11/21 21:56
//#pragma GCC optimize(2)
#include<iostream>
using namespace std;
int mp[10][10];
int ax[10],ay[10],yd[10];
int n,flag,c;
struct node
{
	int mp[10][10];
};
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
void in()
{
	n=read();
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=8;j++)
		{
			int x=read();
			if(!x)break;
			mp[i][j]=x;
		}
	}
}
void show()
{
	int ss=0;
	for(int i=1;i<=n;i++)
	{
		if(yd[i]<0)ss=0;
		else ss=1;
		cout<<ax[i]-ss<<" "<<ay[i]-1<<" "<<yd[i]<<endl;
	}
}
node G(node &m)
{
	for(int i=1;i<=5;i++)
	{
		int x=0;
		for(int j=1;j<=7;j++)
		{
			if(!m.mp[i][j])x++;
			else
			{
				if(!x)continue;
				m.mp[i][j-x]=m.mp[i][j];
				m.mp[i][j]=0;
			}
		}
	}
	return m;
}
bool E(node &m)
{
	int cnt=1,f=0;
	int sign[10][10]={0};
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=7;j++)
		{
			if(j<=5&&m.mp[i][j]==m.mp[i][j+1]&&m.mp[i][j]==m.mp[i][j+2]&&m.mp[i][j])
			{
				sign[i][j]=sign[i][j+1]=sign[i][j+2]=1,f=1;
			}
			if(i<=3&&m.mp[i][j]==m.mp[i+1][j]&&m.mp[i][j]==m.mp[i+2][j]&&m.mp[i][j])
			{
				sign[i][j]=sign[i+1][j]=sign[i+2][j]=1,f=1;
			}
		}
	}
	if(!f)return 0;
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=7;j++)
		{
			if(sign[i][j])
			{
				m.mp[i][j]=0;
				sign[i][j]=0;
			}
			if(m.mp[i][j])c++;
		}
	}
	if(c<3&&c!=0){cout<<"-1"<<endl;flag=1;}
	return 1;
}
bool compare(node &m)
{
	for(int i=1;i<=5;i++)
	{
		if(m.mp[i][1])return 0;
	}
	return 1;
}
node check(node &m,int i)
{
	swap(m.mp[ax[i]][ay[i]],m.mp[ax[i]+yd[i]][ay[i]]);
	m=G(m);
	while(E(m))m=G(m);
	return m;
}
void dfs(int x,node m)
{
	if(flag)return;
	if(x>n)
	{
		flag=compare(m);
		if(flag)show();
		return;
	}
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=7;j++)
		{
			ax[x]=i,ay[x]=j;
			if(i<5&&m.mp[i+1][j]!=m.mp[i][j])
			{
				yd[x]=1;
				dfs(x+1,check(m,x));
			}
			if(i>1&&m.mp[i-1][j]==0)
			{
				yd[x]=-1;
				dfs(x+1,check(m,x));
			}
		}
	}
}
void handle()
{
	node m;
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=7;j++)
		{
			m.mp[i][j]=mp[i][j];
		}
	}
	dfs(1,m);
}
int main()
{
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	in();
	handle();
}
/*
2
1 0
1 0
0
1 0
1 0
*/
/*
2
1 0
0
1 0
0
1 0
*/
2022/11/21 21:56
加载中...