WA 1个点 TLE 6个点 QwQ
/*
* @ Author: Xiaohuba
* @ Usage: Luogu Problem
* @ Language: C++
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define pii pair<int,int>
#define mkp make_pair
#define vi vector<int>
#define vs vector<string>
#define viit vector<int>::iterator
#define il inline
#define Endl putchar('\n')
#define Space putchar(' ')
template <typename T>
il void read(T & tmp){ tmp=0;char c=getchar();bool flg=0;while(!isdigit(c)) flg=c=='-',c=getchar();while(isdigit(c)) tmp=(tmp<<3)+(tmp<<1)+c-'0',c=getchar();if(flg) tmp*=-1; }
template <typename T, typename... Args>
il void read(T &tmp, Args &...tmps){ read(tmp);read(tmps...); }
template <typename T>
il void __write(const T &x){ if(x==0) return;__write(x/10);putchar(x%10+'0'); }
template <typename T>
il void write(const T &x){ if(x==0) putchar('0');if(x<0) putchar('-');__write((x<0 ? -x : x)); }
template <typename T>
il void write_with_space(T &x){ write(x);Space; }
template <typename T>
il void write_with_endl(const T &x){ write(x);Endl; }
template <typename T, typename... Args>
il void write(const T &x, const Args &...y){ write_with_space(x);write_with_space(y...); }
il void __getline(istream & istr, string & str){ getline(istr,str);if(*(str.end()-1)=='\r') str.erase(str.end()-1); }
#define getline __getline
#define For(x,st,ed) for(register int x=st,END=ed;x<=END;++x)
#define ForDown(x,st,ed) for(register int x=st,END=ed;x>=END;--x)
#define sq(x) (x*x)
#define Set(a,b) memset(a,b,sizeof(a))
#define Cpy(a,b) memcpy(a,b,sizeof(a))
/* ---File Head--- */
#define tr(i,j) ((i-1)*5+j)
struct point//存状态的结构体
{
int a[36];//格子,压成了一位数组
int step;//步数
int cnt;//方块数量
bool change[36];//需要改变的位置
int sum[11];//每种颜色的数量
il bool fall()//掉落
{
bool flg=0;
For(j,1,5)
For(i,1,6)
{
if(!a[tr(i,j)]&&a[tr(i+1,j)])
{
flg=1;
int idx=i;
while(!a[tr(idx,j)] && idx) idx--;
idx++;
For(k,i+1,7) a[tr(idx+k-i-1,j)]=a[tr(k,j)];
}
}
return flg;
}
il bool check()//记录消除
{
memset(change,0,sizeof(change));
bool flg=0;
For(i,1,7)
For(j,1,5)
{
if(!a[tr(i,j)]) continue;
int idx1=i,idx2=j;
For(k,i+1,7){
if(a[tr(k,j)]==a[tr(i,j)]) idx1++;
else break;
}
For(k,j+1,5)
{
if(a[tr(i,k)]==a[tr(i,j)]) idx2++;
else break;
}
if(idx1-i+1>=3){
For(k,i,idx1)
change[tr(k,j)]=1,flg=1;
}
if(idx2-j+1>=3){
For(k,j,idx2)
change[tr(i,k)]=1,flg=1;
}
}
return flg;
}
il void doit()//消除
{
For(i,1,7)
For(j,1,5)
if(change[tr(i,j)])
sum[a[tr(i,j)]]--,a[tr(i,j)]=0,cnt--;
}
il void trans(int x, int y, int op)//移动
{
swap(a[tr(x,y)],a[tr(x,y+op)]);
while(1)
{
bool flg1=fall();
bool flg2=check();
doit();
if(!flg1 && !flg2) break;
}
}
il bool valid()//是否合法
{
For(i,1,10) if(sum[i]==1 || sum[i]==2) return 0;
return 1;
}
}s;
int n;
struct operation//操作列表
{
int x,y,op;
}oper[10];
il void output()//输出
{
For(i,1,n){
write(oper[i].x);Space;write(oper[i].y);Space;write(oper[i].op);
Endl;
}
}
void dfs(const point &data)//深搜函数
{
//debug(data);
if(!data.cnt && data.step==n)
{
output();
exit(0);
}
if(data.step==n) return;//已经走了n步但是没有消完,没戏了
For(i,1,7)
For(j,1,5)
{
if(!data.a[tr(i,j)]) continue;
if(j<5)
{
point nd=data;
nd.step++;
nd.trans(i,j,1);
oper[nd.step]=(operation){j-1,i-1,1};//自己的坐标和题意不同,转换一下
if(nd.valid()) dfs(nd);
}
if(!data.a[tr(i,j-1)]&&j>1)
{
point nd=data;
nd.step++;
nd.trans(i,j,-1);
oper[nd.step]=(operation){j-1,i-1,-1};
if(nd.valid()) dfs(nd);
}
oper[data.step+1]=(operation){0,0,0};
}
}
signed main()
{
s.cnt=0;
read(n);
For(i,1,5)
{
int x,j=0;
while(++j)
{
read(x);
if(!x) break;
s.a[tr(j,i)]=x;
s.cnt++;
}
}
s.step=0;
dfs(s);
puts("-1");
return 0;
}