WAon12求调,悬三关
查看原帖
WAon12求调,悬三关
820056
wmrqwqal & su楼主2023/11/10 18:16
#include<bits/stdc++.h>
using namespace std;
long long pdd,n,m,k,q,x,y,xx,yy,vis[60][60],vi[60][60],viss[60][60],b[10][2],c[10],kkk,sum,lunshu,ans,fl=1,bh;
//vis dfs用,b记录主颜色,lunshu代表操作轮数
struct node{
	long long a,b;
}a[60][60];
//a颜色,b特殊状态
long long pd(long long x,long long y)
{
	if(!((a[x][y].a==a[x+1][y].a && a[x+2][y].a==a[x+1][y].a) || (a[x][y].a==a[x+1][y].a && a[x-1][y].a==a[x+1][y].a) || (a[x][y].a==a[x-1][y].a && a[x-2][y].a==a[x-1][y].a) ||
	(a[x][y].a==a[x][y-1].a && a[x][y-2].a==a[x][y].a) || (a[x][y].a==a[x][y-1].a && a[x][y+1].a==a[x][y].a) || (a[x][y].a==a[x][y+1].a && a[x][y+2].a==a[x][y].a)))
		return 0;
	else if(a[x][y].a==a[x+1][y].a && a[x+2][y].a==a[x+1][y].a)
		return 1;
	else if(a[x][y].a==a[x+1][y].a && a[x-1][y].a==a[x+1][y].a)
		return 2;
	else if(a[x][y].a==a[x-1][y].a && a[x-2][y].a==a[x-1][y].a)
		return 3;
	else if(a[x][y].a==a[x][y-1].a && a[x][y-2].a==a[x][y].a)
		return 4;
	else if(a[x][y].a==a[x][y-1].a && a[x][y+1].a==a[x][y].a)
		return 5;
	else
		return 6;
}
void print1()//输出原矩阵颜色,调试用
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<a[i][j].a<<" ";
		cout<<endl;
	}
}
void print2()//输出原矩阵特殊值,调试用
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<a[i][j].b<<" ";
		cout<<endl;
	}
}
void print3()//输出dfs的值
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<vis[i][j]<<" ";
		cout<<endl;
	}	
}
void down()//下落
{
	for(int i=n;i>=1;i--)
		for(int j=1;j<=m;j++)
			for(int k=i;k<=n;k++)
				if(!a[k][j].a)
					swap(a[k-1][j].a,a[k][j].a),swap(a[k-1][j].b,a[k][j].b);
	//print1();
}
/*void dfs(long long x,long long y)
{
	if(x<1 || y<1 || x>n || y>m)
		return ;
	if((a[x][y].a==a[x+1][y].a && a[x][y].a==a[x+2][y].a && (!vis[x][y] || !vis[x+1][y] || !vis[x+2][y])))
		vis[x][y]=1,vis[x+1][y]=1,vis[x+2][y]=1,dfs(x+1,y),dfs(x+2,y);
	if((a[x][y].a==a[x+1][y].a && a[x][y].a==a[x-1][y].a && (!vis[x][y] || !vis[x+1][y] || !vis[x-1][y])))
		vis[x][y]=1,vis[x+1][y]=1,vis[x-1][y]=1,dfs(x+1,y),dfs(x-1,y);	
	if((a[x][y].a==a[x-1][y].a && a[x][y].a==a[x-2][y].a && (!vis[x][y] || !vis[x-1][y] || !vis[x-2][y])))
		vis[x][y]=1,vis[x-1][y]=1,vis[x-2][y]=1,dfs(x-1,y),dfs(x-2,y);
	if((a[x][y].a==a[x][y+1].a && a[x][y].a==a[x][y+2].a && (!vis[x][y] || !vis[x][y+1] || !vis[x][y+2])))
		vis[x][y]=1,vis[x][y+1]=1,vis[x][y+2]=1,dfs(x,y+1),dfs(x,y+2);	
	if((a[x][y].a==a[x][y+1].a && a[x][y].a==a[x][y-1].a && (!vis[x][y] || !vis[x][y+1] || !vis[x][y-1])))
		vis[x][y]=1,vis[x][y+1]=1,vis[x][y-1]=1,dfs(x,y+1),dfs(x,y-1);		
	if((a[x][y].a==a[x][y-1].a && a[x][y].a==a[x][y-2].a && (!vis[x][y] || !vis[x][y-1] || !vis[x][y-2])))
		vis[x][y]=1,vis[x][y-1]=1,vis[x][y-2]=1,dfs(x,y-1),dfs(x,y-2);	
}*/
void dfs(long long x,long long y,long long color)
{
	bool pd=0;
	if(x<1 || y<1 || x>n || y>m || !a[x][y].a)
		return ;
	if((a[x][y].a==a[x+1][y].a && a[x][y].a==a[x+2][y].a && a[x][y].a==color && (!vis[x][y] || !vis[x+1][y] || !vis[x+2][y])))
		vis[x][y]=1,vis[x+1][y]=1,vis[x+2][y]=1,pd=1;
	if((a[x][y].a==a[x+1][y].a && a[x][y].a==a[x-1][y].a && a[x][y].a==color && (!vis[x][y] || !vis[x+1][y] || !vis[x-1][y])))
		vis[x][y]=1,vis[x+1][y]=1,vis[x-1][y]=1,pd=1;	
	if((a[x][y].a==a[x-1][y].a && a[x][y].a==a[x-2][y].a && a[x][y].a==color && (!vis[x][y] || !vis[x-1][y] || !vis[x-2][y])))
		vis[x][y]=1,vis[x-1][y]=1,vis[x-2][y]=1,pd=1;
	if((a[x][y].a==a[x][y+1].a && a[x][y].a==a[x][y+2].a && a[x][y].a==color && (!vis[x][y] || !vis[x][y+1] || !vis[x][y+2])))
		vis[x][y]=1,vis[x][y+1]=1,vis[x][y+2]=1,pd=1;	
	if((a[x][y].a==a[x][y+1].a && a[x][y].a==a[x][y-1].a && a[x][y].a==color && (!vis[x][y] || !vis[x][y+1] || !vis[x][y-1])))
		vis[x][y]=1,vis[x][y+1]=1,vis[x][y-1]=1,pd=1;		
	if((a[x][y].a==a[x][y-1].a && a[x][y].a==a[x][y-2].a && a[x][y].a==color && (!vis[x][y] || !vis[x][y-1] || !vis[x][y-2])))
		vis[x][y]=1,vis[x][y-1]=1,vis[x][y-2]=1,pd=1;	
	if(!pd)
		return ;
	dfs(x,y-1,color),dfs(x,y-2,color),dfs(x,y+1,color),dfs(x,y+2,color);
	dfs(x-1,y,color),dfs(x-2,y,color),dfs(x+1,y,color),dfs(x+2,y,color);
	dfs(x-1,y-1,color),dfs(x-1,y+1,color),dfs(x+1,y-1,color),dfs(x+1,y+1,color);
}
long long _1(long long x);
long long _2(long long x);
long long _3(long long x,long long y);
long long _4(long long x,long long y);
long long _5(long long x,long long y);
long long _6(long long x,long long y);
long long _1(long long x)
{
	long long sum=0;
	for(int i=1;i<=m;i++)
	{
		long long co=a[x][i].a;
		sum+=a[x][i].a,a[x][i].a=0;
		if(a[x][i].b==2)
			a[x][i].b=0,sum+=_2(i);
		if(a[x][i].b==3)	
			a[x][i].b=0,sum+=_3(x,i);
		if(a[x][i].b==4)	
			a[x][i].b=0,sum+=_4(x,i);
		if(a[x][i].b==5)	
			a[x][i].b=0,sum+=_5(x,i);
		if(a[x][i].b==6)	
			sum-=co,a[x][i].a=co,a[x][i].b=0,sum+=_6(x,i);
	}
	return sum;
}
long long _2(long long x)
{
	long long sum=0;
	for(int i=1;i<=n;i++)
	{
		long long co=a[i][x].a;
		sum+=a[i][x].a,a[i][x].a=0;
		if(a[i][x].b==1)
			a[i][x].b=0,sum+=_1(i);
		if(a[i][x].b==3)	
			a[i][x].b=0,sum+=_3(i,x);
		if(a[i][x].b==4)
			a[i][x].b=0,sum+=_4(i,x);
		if(a[i][x].b==5)
			a[i][x].b=0,sum+=_5(i,x);
		if(a[i][x].b==6)
			sum-=co,a[i][x].a=co,a[i][x].b=0,sum+=_6(i,x);
	}
	return sum;
}
long long _3(long long x,long long y)
{
	long long sum=0;
	for(int i=1;i<=m;i++)
	{
		long long co=a[x][i].a;
		sum+=a[x][i].a,a[x][i].a=0;
		if(a[x][i].b==2)
			a[x][i].b=0,sum+=_2(i);
		if(a[x][i].b==3)
			a[x][i].b=0,sum+=_3(x,i);
		if(a[x][i].b==4)
			a[x][i].b=0,sum+=_4(x,i);
		if(a[x][i].b==5)
			a[x][i].b=0,sum+=_5(x,i);
		if(a[x][i].b==6)
			sum-=co,a[x][i].a=co,a[x][i].b=0,sum+=_6(x,i);
	}
	for(int i=1;i<=n;i++)
	{
		long long co=a[i][y].a;
		sum+=a[i][y].a,a[i][y].a=0;
		if(a[i][y].b==1)
			a[i][y].b=0,sum+=_1(i);
		if(a[i][y].b==3)
			a[i][y].b=0,sum+=_3(i,y);
		if(a[i][y].b==4)
			a[i][y].b=0,sum+=_4(i,y);
		if(a[i][y].b==5)
			a[i][y].b=0,sum+=_5(i,y);
		if(a[i][y].b==6)
			sum-=co,a[i][y].a=co,a[i][y].b=0,sum+=_6(i,y);
	}
	return sum;	
}
long long _4(long long x,long long y)
{
	long long sum=0;
	for(int i=max(1ll,x-1);i<=min(n,x+1);i++)
	{
		for(int j=max(1ll,y-1);j<=min(n,y+1);j++)
		{
			long long co=a[i][j].a;
			sum+=a[i][j].a,a[i][j].a=0;
			if(a[i][j].b==1)
				a[i][j].b=0,sum+=_1(i);
			if(a[i][j].b==2)
				a[i][j].b=0,sum+=_2(j);
			if(a[i][j].b==3)
				a[i][j].b=0,sum+=_3(i,j);
			if(a[i][j].b==4)
				a[i][j].b=0,sum+=_4(i,j);
			if(a[i][j].b==5)
				a[i][j].b=0,sum+=_5(i,j);
			if(a[i][j].b==6)
				sum-=co,a[i][j].a=co,a[i][j].b=0,sum+=_6(i,j);
			
		}
	}
	return sum;
}
long long _5(long long x,long long y)
{
	long long sum=0;
	for(int i=max(1ll,x-2);i<=min(n,x+2);i++)
	{
		for(int j=max(1ll,y-2);j<=min(m,y+2);j++)
		{
			long long co=a[i][j].a;
			sum+=a[i][j].a,a[i][j].a=0;
			if(a[i][j].b==1)
				a[i][j].b=0,sum+=_1(i);
			if(a[i][j].b==2)
				a[i][j].b=0,sum+=_2(j);
			if(a[i][j].b==3)
				a[i][j].b=0,sum+=_3(i,j);
			if(a[i][j].b==4)
				a[i][j].b=0,sum+=_4(i,j);
			if(a[i][j].b==5)
				a[i][j].b=0,sum+=_5(i,j);
			if(a[i][j].b==6)
				/*cout<<"<co:"<<co<<">",*/sum-=co,a[i][j].a=co,a[i][j].b=0,sum+=_6(i,j);
		}
	}
	return sum;
}
long long _6(long long x,long long y)
{
	long long sum=0,colour=a[x][y].a;
//	cout<<"<<colour:"<<colour<<">>"<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j].a==colour)
			{
				sum+=a[i][j].a,a[i][j].a=0;
				if(a[i][j].b==1)
					a[i][j].b=0,sum+=_1(i);
				if(a[i][j].b==2)
					a[i][j].b=0,sum+=_2(j);
				if(a[i][j].b==3)
					a[i][j].b=0,sum+=_3(i,j);
				if(a[i][j].b==4)
					a[i][j].b=0,sum+=_4(i,j);
				if(a[i][j].b==5)
					a[i][j].b=0,sum+=_5(i,j);
			}
		}
	}
	return sum;
}
bool check()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(a[i][j].a)
				if(pd(i,j))
					return 1;
	return 0;
}
long long wonderful_game()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(a[i][j].a)
				return 0;
	return 10000;
}
long long wonderful_q()
{
	if(!fl)
		return 0;
	return 1000;
}
void fqc(long long x,long long y,long long colo)
{
	if(x<1 || y<1 || x>n || y>m || vi[x][y] || !colo || a[x][y].a!=colo)
		return ;
	sum++;
	vi[x][y]=1;
	fqc(x-1,y,colo);
	fqc(x+1,y,colo);
	fqc(x,y+1,colo);
	fqc(x,y-1,colo);
}
void play(long long x,long long y,long long lunshu)
{
	if(wonderful_game())
		return ;
	for(int i=0;i<=55;i++)
		for(int j=0;j<=55;j++)
			vis[i][j]=0,vi[i][j]=0,viss[i][j]=0;
	dfs(x,y,a[x][y].a);
	sum=0;
	/*for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(vis[i][j])
				sum++;
	ans+=max(0ll,(max((sum-3),0ll)*max((sum-3)*50,0ll)));//组合奖分1*/
	sum=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(vis[i][j])
				viss[i][j]=a[i][j].a;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(vis[i][j])
			{
				sum=0;
				fqc(i,j,viss[i][j]);
				ans+=max(0ll,(max((sum-3),0ll)*max((sum-3)*50,0ll)));
			//	cout<<"组合奖分3:"<<max(0ll,(max((sum-3),0ll)*max((sum-3)*50,0ll)))<<endl;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(vis[i][j])
			{
				long long co=a[i][j].a;
				sum+=a[i][j].a,a[i][j].a=0;
				if(a[i][j].b==1)
					a[i][j].b=0,sum+=_1(i);
				if(a[i][j].b==2)
					a[i][j].b=0,sum+=_2(j);	
				if(a[i][j].b==3)
					a[i][j].b=0,sum+=_3(i,j);
				if(a[i][j].b==4)
					a[i][j].b=0,sum+=_4(i,j);
				if(a[i][j].b==5)
					a[i][j].b=0,sum+=_5(i,j);	
				if(a[i][j].b==6)
					a[i][j].a=co,sum-=co,a[i][j].b=0,sum+=_6(i,j);				
			}
		}
	}
	ans+=sum*lunshu;//消除奖分
	ans+=80*(lunshu-1)*(lunshu-1);//连锁奖分
//	print1();
//	cout<<"消除奖分:"<<sum*lunshu<<endl;
//	cout<<"连锁奖分:"<<80*(lunshu-1)*(lunshu-1)<<endl;
	down();
//	print3();
//	print2();
//	print1();//颜色
	if(check())
	{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(a[i][j].a)
					if(pd(i,j))
						play(i,j,lunshu+1);
	}
}
void solve(long long x,long long y,long long xx,long long yy)
{
	if(wonderful_game())
		return ;
	pdd=1;
	for(int i=0;i<=55;i++)
		for(int j=0;j<=55;j++)
			vis[i][j]=0;
	dfs(x,y,a[x][y].a);
	sum=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(vis[i][j])
				sum++;
//	cout<<"组合1:"<<max(0ll,(max((sum-3),0ll)*max((sum-3),0ll)*50))<<endl;
	ans+=max(0ll,(max((sum-3),0ll)*max((sum-3),0ll)*50));//组合奖分1
	long long last=sum;
	dfs(xx,yy,a[xx][yy].a);
	sum=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(vis[i][j])
				sum++;
//	print2();//状态
//	cout<<"组合2:"<<max(0ll,(max((sum-last-3),0ll)*max((sum-last-3)*50,0ll)))<<endl;
	ans+=max(0ll,(max((sum-last-3),0ll)*max((sum-last-3)*50,0ll)));//组合奖分2
	if(pd(x,y) && pd(xx,yy))
		c[kkk]=1,b[kkk][0]=a[x][y].a,b[kkk++][1]=a[xx][yy].a,kkk%=5;
	else if(pd(x,y))
		c[kkk]=0,b[kkk++][0]=a[x][y].a,kkk%=5;
	else if(pd(xx,yy))
		c[kkk]=0,b[kkk++][0]=a[xx][yy].a,kkk%=5;
	sum=0;
//	print3();//消除
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(vis[i][j])
			{
				long long co=a[i][j].a;
				sum+=a[i][j].a,a[i][j].a=0;
				if(a[i][j].b==1)
					a[i][j].b=0,sum+=_1(i);
				if(a[i][j].b==2)
					a[i][j].b=0,sum+=_2(j);	
				if(a[i][j].b==3)
					a[i][j].b=0,sum+=_3(i,j);
				if(a[i][j].b==4)
					a[i][j].b=0,sum+=_4(i,j);
				if(a[i][j].b==5)
					a[i][j].b=0,sum+=_5(i,j);	
				if(a[i][j].b==6)
					a[i][j].a=co,sum-=co,a[i][j].b=0,sum+=_6(i,j);				
			}
		}
	}
	ans+=sum*lunshu;//消除奖分
	//cout<<"消除奖分:"<<sum*lunshu<<endl;
	ans+=80*(lunshu-1)*(lunshu-1);//连锁奖分
	//cout<<"连锁奖分:"<<80*(lunshu-1)*(lunshu-1)<<endl;
	down();
//	print1();//颜色
	if(check())
	{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(a[i][j].a)
					if(pd(i,j))
						play(i,j,2);
	}
}
long long five()
{
	long long maxn=0;
	for(int i=0;i<=c[0];i++)
	{
		for(int i2=0;i2<=c[1];i2++)
		{
			for(int i3=0;i3<=c[2];i3++)
			{
				for(int i4=0;i4<=c[3];i4++)
				{
					for(int i5=0;i5<=c[4];i5++)
					{
						long long su=0,d[110]={0},onemax=0,one=0,two=0,twomin=0,twomax=0,three=0,threemax=0,four=0,fourmax=0,five=0,fivemax=0;//桶
						if(i==0)
							d[b[0][0]]++;
						else
							d[b[0][1]]++;
						if(i2==0)
							d[b[1][0]]++;
						else
							d[b[1][1]]++;	
						if(i3==0)
							d[b[2][0]]++;
						else
							d[b[2][1]]++;	
						if(i4==0)
							d[b[3][0]]++;
						else
							d[b[3][1]]++;		
						if(i5==0)
							d[b[4][0]]++;
						else
							d[b[4][1]]++;	
						for(int j=0;j<=100;j++)
						{
							if(d[j]==1)
								one++,onemax=j;
							if(d[j]==2)
							{
								two++;
								if(twomin==0)
									twomin=j;
								twomax=j;
							}
							if(d[j]==3)
								three++,threemax=j;
							if(d[j]==4)
								four++,fourmax=j;
							if(d[j]==5)
								five++,fivemax=j;
						}	
						if(one==5)
							su+=onemax;
						else if(two==1 && one==3)
							su+=100+twomax*2;
						else if(two==2 && one==1)
							su+=200+twomax*2+twomin;
						else if(three==1 && one==2)
							su+=300+three*3;
						else if(three==1 && two==1)
							su+=500+threemax*3+twomax*2;
						else if(four==1 && one==1)
							su+=750+fourmax*5;
						else if(five==1)
							su+=1000+fivemax*10;
						maxn=max(maxn,su);
					}
				}
			}
		}
	}
	//cout<<maxn<<endl;
	return maxn;
}
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define QwQ return 0;
int main()
{
	IOS;
//	freopen()
	cin>>n>>m>>k>>q;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j].a;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j].b;	
	while(q--)
	{
	//	bh++;
		lunshu=1;
		down();
		cin>>x>>y>>xx>>yy;		
		swap(a[x][y].a,a[xx][yy].a),swap(a[x][y].b,a[xx][yy].b);
		if(abs(x-xx)+abs(y-yy)==1 && a[x][y].a && a[xx][yy].a && x>=1 && x<=n && xx>=1 && xx<=n && y>=1 && yy>=1 && yy<=m && y<=m && (pd(x,y) || pd(xx,yy))) 
			solve(x,y,xx,yy);
		else
			swap(a[x][y].a,a[xx][yy].a),swap(a[x][y].b,a[xx][yy].b),fl=0;
		if(kkk%5==0 && pdd)
			ans+=five();
		if(wonderful_game())
			break;
		//cout<<ans<<endl;
	}
	cout<<ans+wonderful_game()+wonderful_q();
	QwQ;
}
2023/11/10 18:16
加载中...