玄学九十分
查看原帖
玄学九十分
141335
qwq2519楼主2020/9/19 21:17
#include <bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
using namespace std;
int a[6][11][11],n,b[11][11],step[11][11],flag;
void change()
{
	rep(i,0,4) {
		int k=0;
		rep(j,0,6) {
			if(b[j][i]) {
				swap(b[j-k][i],b[j][i]);
			} else k++;
		}
	}
}
bool vis[10][10];
int xc() {
	change();
	memset(vis,0,sizeof vis);
	int fla=0;
	rep(i,0,6) rep(j,0,4)
	{
		if(!b[i][j]) continue;
			if(b[i+1][j]==b[i][j]&&b[i+2][j]==b[i][j]&&i+2<=6)
			{
				vis[i+1][j]=vis[i][j]=vis[i+2][j]=1;
				fla=1;
			}
			if(b[i][j+1]==b[i][j]&&b[i][j+2]==b[i][j]&&j+2<=4)
			{
				vis[i][j+1]=vis[i][j]=vis[i][j+2]=1;
				fla=1;
			}
	}
	rep(i,0,6) rep(j,0,4)
	if(vis[i][j])
		b[i][j]=0;
	if(fla) xc();
}
int check() {
	rep(i,0,4)
	if(b[0][i]) return 0;
	return 1;
}
void dfs(int num) {
	if(num>n) {
		if(check()) {
			for(int k=1; k<num; k++)
				cout<<step[k][1]<<" "<<step[k][2]<<" "<<step[k][3]<<endl;
			exit(0);
		}
		return ;
	}
	memmove(a[num],b,sizeof b);
		rep(j,0,4)
		rep(i,0,6)
		{
			if(!b[i][j]) continue;
			if(b[i][j]!=b[i][j+1]&&j+1<=6) {
				swap(b[i][j],b[i][j+1]);
				xc();
				step[num][1]=j;
				step[num][2]=i;
				step[num][3]=1;
				dfs(num+1);
				memmove(b,a[num],sizeof a[num]);
			}
			if(!b[i][j-1]&&j-1>=0)
			{
				swap(b[i][j],b[i][j-1]);
				xc();
				step[num][1]=j;
				step[num][2]=i;
				step[num][3]=-1;
				dfs(num+1);
				memmove(b,a[num],sizeof a[num]);
			}
		}
}
int main() {
	ios::sync_with_stdio(false);
	cin>>n;
	rep(i,0,4)
	{
		int x,j=0;
		while((cin>>x)&&x)
			b[j++][i]=x;
	}
	dfs(1);
	cout<<"-1";
}

第一组答案错误 还有为什么a数组这个回溯的保存现场的数组不能开二维 再重复迭代

2020/9/19 21:17
加载中...