样例过30分求助
查看原帖
样例过30分求助
1183074
xzy_AK_IOI楼主2024/12/12 21:06
#include<bits/stdc++.h>
using namespace std;
#define F(i,k,n) for (int i=k;i<=n;i++)
typedef long long ll;
const int N=10;
int n; 
int chuan[N][N];
int X[N],Y[N],g[N];
bool pan[N][N];
map <string,bool> mp;
string chong(int c[N][N]){
	string s="";
	F(i,1,7){
		F(j,1,5){
			s+=char(c[i][j]+'0');
		}
	}
	return s;
}
void change(int flag,int x,int y){
	if (flag==1){
		swap(chuan[x][y],chuan[x][y+1]);
	}
	else swap(chuan[x][y],chuan[x][y-1]);
}
void down(){
	bool F=1;
	while (F){
		memset(pan,0,sizeof(pan));
		F=0;
		F(i,1,7){
			F(j,1,3){
				if (chuan[i][j]==chuan[i][j+1] && chuan[i][j+1]
			    ==chuan[i][j+2] && chuan[i][j]!=0){
			 		pan[i][j]=pan[i][j+1]=pan[i][j+2]=1;
			 		F=1;
			    }
			}
		}
		F(i,1,5){
			F(j,1,5){
				if (chuan[j][i]==chuan[j+1][i] && chuan[j+1][i]
				==chuan[j+2][i] && chuan[j][i]!=0){
					pan[j][i]=pan[j+1][i]=pan[j+2][i]=1;
					F=1;
				}
			}
		}
		F(i,1,7){
			F(j,1,5){
				if (pan[i][j]) chuan[i][j]=0;
			}
		}
		F(i,1,5){
			int now=0;
			F(j,1,7){
				if (chuan[j][i]==0) break;
				now=j;
			}
			F(j,now+1,7){
				if (chuan[j][i]){
					now++;
					chuan[now][i]=chuan[j][i];
					chuan[j][i]=0;
				}
			}
		}
	}
}
void dfs(int step){
	//string Now=chong(chuan);
	//if (mp[Now]) return ;
	//mp[Now]=1;
	if (step==n){
		bool Flag=1;
		F(i,1,7){
			F(j,1,5) if (chuan[i][j]) Flag=0;
		}
		if (Flag==1){
			F(i,0,n-1) cout<<Y[i]-1<<' '<<X[i]-1<<' '<<g[i]<<'\n';
			exit(0);
		}
		return ;
	}
	int m[N][N]; 
	F(j,1,5){
		F(i,1,7){
			if (chuan[i][j]==0) continue;
			F(i2,1,7){
				F(j2,1,5){
					m[i2][j2]=chuan[i2][j2];
				}
			}
			if (j>1){
				X[step]=i;
				Y[step]=j;
				g[step]=1;
				change(1,i,j);
				down();
				dfs(step+1);
				F(i2,1,7) F(j2,1,5) chuan[i2][j2]=m[i2][j2];
			}
			if (j<5){
				X[step]=i;
				Y[step]=j;
				g[step]=-1;
				change(-1,i,j);
				down();
				dfs(step+1);
				F(i2,1,7) F(j2,1,5) chuan[i2][j2]=m[i2][j2];
			}
		}
	}
}
int main(){
	cin>>n;
	F(i,1,5){
		int A;
		F(j,1,N){
			cin>>A;
			if (!A) break;
			chuan[j][i]=A;
		}
	}
	dfs(0);
	cout<<-1;
	return 0;
}
/*
4
1 0
2 1 0
2 3 4 0
3 1 0
2 4 3 4 0
*/
2024/12/12 21:06
加载中...