WA on #17 求条
查看原帖
WA on #17 求条
822145
chenzhaoxu2027楼主2024/3/22 21:43

rt

#include <bits/stdc++.h>
using namespace std;
#define int long long
int b[55][55];
int op[55][55];
int v[55][55];
int bj[55][55];
int n,m,k,q;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int sum1,sum2,sum3,sum4,sum5;
int sz1,sz2,sz3;
int tong[105];
int mainclr[105][2];
int z[105];
struct tng{
	int x,id;
}tmp[105];
int main1=-1,main2=-1;
bool cmp(tng a,tng b){
	return a.x>b.x;
}
bool cmpid(tng a,tng b){
	return a.id<b.id;
}
void spj(int x,int y){
	if(x<1||y<1||x>n||y>m){
		return;
	}
	if(op[x][y]<0){
		return;
	}
	sz1+=b[x][y]*sz2;
	if(op[x][y]==0){
		b[x][y]=op[x][y]=-1;
		return;
	}
	if(op[x][y]==1){
		b[x][y]=op[x][y]=-1;
		for(int i=1;i<=m;i++){
			spj(x,i);
		}
	}
	else if(op[x][y]==2){
		b[x][y]=op[x][y]=-1;
		for(int i=1;i<=n;i++){
			spj(i,y);
		}
	}
	else if(op[x][y]==3){
		b[x][y]=op[x][y]=-1;
		for(int i=1;i<=n;i++){
			spj(i,y);
		}
		for(int i=1;i<=m;i++){
			spj(x,i);
		}
	}
	else if(op[x][y]==4){
		b[x][y]=op[x][y]=-1;
		for(int i=x-1;i<=x+1;i++){
			for(int j=y-1;j<=y+1;j++){
				spj(i,j);
			}
		}
	}
	else if(op[x][y]==5){
		b[x][y]=op[x][y]=-1;
		for(int i=x-2;i<=x+2;i++){
			for(int j=y-2;j<=y+2;j++){
				spj(i,j);
			}
		}
	}
	else if(op[x][y]==6){
		op[x][y]=-1;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(b[x][y]!=b[i][j]||(x==i&&y==j)){
					continue;
				}
				spj(i,j);
			}
		}
		b[x][y]=-1;
	}
}
int f;
void dfs(int x,int y){
//	cout<<"dfs:"<<x<<"-"<<y<<"\n";
	sz3+=1;
	tong[b[x][y]]++;
	bj[x][y]=1;
	for(int i=0;i<4;i++){
		int x2=x+dx[i];
		int y2=y+dy[i];
		if(x==5&&y==4){
//			cout<<bj[6][4]<<"\n";
		}
		if(x2>=1&&y2>=1&&x2<=n&&y2<=m&&v[x2][y2]==1&&bj[x2][y2]==0&&b[x][y]==b[x2][y2]){
			dfs(x2,y2);
		}
	}
}
bool boom(){
	int ishave=0;
	f=(sz2==1);
	//行 
	for(int i=1;i<=n;i++){
		for(int j=3;j<=m;j++){
			if(op[i][j]==-1){
				continue;
			}
			if(b[i][j]==b[i][j-1]&&b[i][j]==b[i][j-2]){
				v[i][j]=1;
				v[i][j-1]=1;
				v[i][j-2]=1;
				ishave=1;
			}
		}
	}
	//列 
	for(int i=3;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(op[i][j]==-1){
				continue;
			}
			if(b[i][j]==b[i-1][j]&&b[i][j]==b[i-2][j]){
				v[i][j]=1;
				v[i-1][j]=1;
				v[i-2][j]=1;
				ishave=1;
			}
		}
	}
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=m;j++){
//			cout<<v[i][j]<<" ";
//		}
//		cout<<"\n";
//	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(v[i][j]==1){
				if(bj[i][j]==0){
					dfs(i,j);
//					cout<<i<<"-"<<j<<"\n";
//					cout<<sz3<<"\n";
					sum3+=50*(sz3-3)*(sz3-3);
					sz3=0;
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(v[i][j]==1){
				v[i][j]=0;
				spj(i,j);
			}
		}
	}
	int mx=0;
	for(int i=1;i<=100;i++){
		mx=max(tong[i]*f,mx);
	}
	for(int i=1;i<=100;i++){
		if(tong[i]==mx&&mx!=0){
			if(main1==-1){
				main1=i;
			}
			else{
				main2=i;
			}
		}
	}
	memset(bj,0,sizeof(bj));
	memset(tong,0,sizeof(tong));
	return ishave;
}
void G(){
	for(int j=1;j<=m;j++){
		queue<int> q;
		queue<int> opq;
		for(int i=n;i>=1;i--){
			if(b[i][j]!=-1){
				q.push(b[i][j]);
				opq.push(op[i][j]);
				b[i][j]=op[i][j]=-1;
			}
		}
		for(int i=n;q.size();i--){
			b[i][j]=q.front();
			op[i][j]=opq.front();
			q.pop();
			opq.pop();
		}
	}
}
void printb(){
	cout<<"========printb=========\n";
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<b[i][j]<<" ";
		}
		cout<<"\n";
	}
}
void slvsum4(){
	int mx=0;
	for(int a1=0;a1<=1;a1++){
		for(int a2=0;a2<=1;a2++){
			for(int a3=0;a3<=1;a3++){
				for(int a4=0;a4<=1;a4++){
					for(int a5=0;a5<=1;a5++){
						z[1]=mainclr[0][a1];
						z[2]=mainclr[1][a2];
						z[3]=mainclr[2][a3];
						z[4]=mainclr[3][a4];
						z[5]=mainclr[4][a5];
						if(z[1]==-1||z[2]==-1||z[3]==-1||z[4]==-1||z[5]==-1){
							continue;
						}
						sort(z+1,z+6);
						tmp[z[1]].x++;
						tmp[z[2]].x++;
						tmp[z[3]].x++;
						tmp[z[4]].x++;
						tmp[z[5]].x++;
						sort(tmp+1,tmp+101,cmp);
						if(z[1]==z[2]&&z[2]==z[3]&&z[3]==z[4]&&z[4]==z[5]){
							mx=max(1000+z[1]*10,mx);
						}
						else if(tmp[1].x==4){
							mx=max(mx,750+tmp[1].id*5);
						}
						else if(tmp[1].x==3&&tmp[2].x==2){
							mx=max(mx,500+tmp[1].id*3+tmp[2].id);
						}
						else if(tmp[1].x==3){
							mx=max(mx,300+tmp[1].id*3+tmp[2].id);
						}
						else if(tmp[1].x==2&&tmp[2].x==2){
							mx=max(mx,200+max(tmp[1].id,tmp[2].id)+tmp[1].id+tmp[2].id);
						}
						else if(tmp[1].x==2){
							mx=max(mx,100+tmp[1].id*2);
						}
						else{
							mx=max(mx,50+max(z[1],max(z[2],max(z[3],max(z[4],z[5])))));
						}
						tmp[1].x=0;
						tmp[2].x=0;
						tmp[3].x=0;
						tmp[4].x=0;
						tmp[5].x=0;
						sort(tmp+1,tmp+101,cmpid);
//						cout<<z[1]<<" "<<z[2]<<" "<<z[3]<<" "<<z[4]<<" "<<z[5]<<"-"<<mx<<"\n";
					}
				}
			}
		}
	}
	sum4+=mx;
}
signed main() {
	memset(b,0xff,sizeof(b));
	memset(op,0xff,sizeof(op));
	for(int i=1;i<=100;i++){
		tmp[i].id=i;
	}
	cin>>n>>m>>k>>q;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>b[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>op[i][j];
		}
	}
	int r=1;
	int cnt=0;
	for(int i=1;i<=q;i++){
		G();
		main1=-1,main2=-1;
		int x,y,xx,yy;
		cin>>x>>y>>xx>>yy;
		if(!(((abs(x-xx)==1&&y==yy)||(abs(y-yy)==1&&x==xx))&&op[x][y]!=-1&&op[xx][yy]!=-1)){
			r=0;
			continue;
		}
		swap(b[x][y],b[xx][yy]);
		swap(op[x][y],op[xx][yy]);
		sz2++;
		while(boom()){
			G();
//			printb();
			sz2++;
		}
		sz2--;
		if(sz2==0){
			swap(b[x][y],b[xx][yy]);
			swap(op[x][y],op[xx][yy]);
			r=0;
			continue;
		}
		cnt++;
		sum1+=sz1;
		sz1=0;
		sum2+=80*(sz2-1)*(sz2-1);
		sz2=0;
		mainclr[i%5][0]=main1;
		mainclr[i%5][1]=main2;
		if(cnt==5){
			slvsum4();
			cnt=0;
		}
//		cout<<sum1<<" "<<sum2<<" "<<sum3<<"\n";
	}
//	cout<<sum4<<"\n";
	int rs=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(op[i][j]!=-1){
				rs=0;
				break;
			}
		}
		if(rs==0){
			break;
		}
	}
	sum5=r*1000+rs*10000;
//	cout<<sum5<<"\n";
	cout<<sum1+sum2+sum3+sum4+sum5;
	return 0;
}
2024/3/22 21:43
加载中...