萌新刚学 OI WA 60 求救
查看原帖
萌新刚学 OI WA 60 求救
556362
Unnamed114514楼主2022/2/26 12:00
#include<bits/stdc++.h>
using namespace std;
int n,a[10][10],t[10];
bool vis[10][10];
struct node{
	int x,y,g;
};
vector<node> v;
inline bool check(){
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j)
			if(a[i][j])
				return 0;
	return 1;
}
inline bool c(int x,int y){
	return x>=0&&x<5&&y>=0&&y<7;
}
inline bool ch(int x,int y,int xq,int yq){
	return c(x,y)&&a[x][y]==a[xq][yq];
}
inline void down(){
	for(int i=0;i<5;++i){ 
		int cnt=0;
		for(int j=0;j<7;++j)
			if(a[i][j])
				t[cnt++]=a[i][j];
		for(int j=0;j<cnt;++j)
			a[i][j]=t[j];
		for(int j=cnt;j<7;++j)
			a[i][j]=0;
	}
	return;
}
inline bool work(){
	memset(vis,0,sizeof(vis));
	bool p=0;
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j){
			if(!a[i][j])
				break;
			bool x=0;
			if(ch(i-2,j,i,j)&&ch(i-1,j,i,j))
				vis[i-2][j]=vis[i-1][j]=vis[i][j]=p=1;
			if(ch(i,j-2,i,j)&&ch(i,j-1,i,j))
				vis[i][j-2]=vis[i][j-1]=vis[i][j]=p=1;
		}
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j)
			if(vis[i][j])
				a[i][j]=0;
	down();
	return p;
}
unordered_map<string,int> mp;
void dfs(int x){
	if(x>n)
		return;
	if(check()){
		if(x!=n)
			return;
		for(int i=0;i<n;++i)
			printf("%d %d %d\n",v[i].x,v[i].y,v[i].g);
		exit(0);
	}
	string s="\0";
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j)
			s+=(a[i][j]^'0');
	if(mp.count(s)&&x>=mp[s])
		return;
	mp[s]=x;
	int b[10][10]={};
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j){
			if(!a[i][j])
				break;
			for(int o=0;o<5;++o)
				for(int p=0;p<7;++p)
					b[o][p]=a[o][p];
			if(c(i+1,j)&&a[i][j]!=a[i+1][j]){
				swap(a[i][j],a[i+1][j]);
				while(work());
				v.push_back(node({i,j,1}));
				dfs(x+1);
				v.pop_back();
				for(int o=0;o<5;++o)
					for(int p=0;p<7;++p)
						a[o][p]=b[o][p];
			}
			if(c(i-1,j)&&!a[i-1][j]){
				swap(a[i][j],a[i-1][j]);
				while(work());
				v.push_back(node({i,j,-1}));
				dfs(x+1);
				v.pop_back();
				for(int o=0;o<5;++o)
					for(int p=0;p<7;++p)
						a[o][p]=b[o][p];
			}
		}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<5;++i)
	    for(int j=0;j<8;++j){
	    	scanf("%d",&a[i][j]);
	    	if(!a[i][j])
				break;
		}
	dfs(0);
	puts("-1");
	return 0;
}
2022/2/26 12:00
加载中...