厌氧代码 90 分求助/ll
查看原帖
厌氧代码 90 分求助/ll
203008
山田リョウ楼主2022/11/1 13:36
#include<stdio.h>
int n,a[6][5][8],vis[5][7],ans[6][3];
void copy(int k){
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j)
			a[k][i][j]=a[k-1][i][j];
}
void down(int k){
	for(int i=0;i<5;++i)
		for(int j=0,t=0,x;j<7;++j)
			if(a[k][i][j]){
				x=a[k][i][j],a[k][i][j]=0,a[k][i][t++]=x;
			}
}
void update(int k){
	down(k);
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j)
			vis[i][j]=0;
	int flag=0;
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j){
			if(j<5&&a[k][i][j]&&a[k][i][j]==a[k][i][j+1]&&a[k][i][j+1]==a[k][i][j+2])
				flag=vis[i][j]=vis[i][j+1]=vis[i][j+2]=1;
			if(i>1&&a[k][i][j]&&a[k][i][j]==a[k][i-1][j]&&a[k][i-1][j]==a[k][i-2][j])
				flag=vis[i][j]=vis[i-1][j]=vis[i-2][j]=1;
		}
	if(flag){
		for(int i=0;i<5;++i)
			for(int j=0;j<7;++j)
				if(vis[i][j])
					a[k][i][j]=0;
		update(k);
	}
}
bool check(int k){
	for(int i=0;i<5;++i)if(a[k][i][0])return 0;
	return 1;
}
bool dfs(int k){
	if(k>n)return check(n);
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j)
			if(a[k-1][i][j]){
				if(i<4){
					copy(k);
					a[k][i][j]=a[k-1][i+1][j],a[k][i+1][j]=a[k-1][i][j];
					update(k);
					if(dfs(k+1)){
						ans[k][0]=i,ans[k][1]=j,ans[k][2]=1;
						return 1;
					}
				}
				if(i&&!a[k-1][i-1][j]){
					copy(k);
					a[k][i-1][j]=a[k][i][j],a[k][i][j]=0;
					update(k);
					if(dfs(k+1)){
						ans[k][0]=i,ans[k][1]=j,ans[k][2]=-1;
						return 1;
					}
				}
			}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<5;++i)
		for(int j=0;scanf("%d",&a[0][i][j]),a[0][i][j];++j);
	if(dfs(1))
		for(int i=1;i<=n;++i)
			printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
	else puts("-1");
	return 0;
}

开 o2 就 RE 一片,不开 o2 #8 过不去

#8
in:
5
2 0
2 3 4 3 0
4 4 3 4 6 2 0
4 6 1 1 4 4 3 0
3 4 6 6 1 3 4 0
ans:
1 1 -1
2 4 1
3 2 1
3 6 1
3 3 1
out:
0 0 1
0 0 1
0 0 1
0 0 1
0 0 0
2022/11/1 13:36
加载中...