首页 > 其他分享 >刷题-德州消消乐

刷题-德州消消乐

时间:2023-10-25 22:01:36浏览次数:26  
标签:int sum 消消 del vx 德州 main col 刷题

2023/10/24晚上打了一半
2023/10/25晚上打完了

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
bool cmp_bg_to_sm(int x,int y){
	return x>y;
}
int n,m,k,q,score,cnt_main_col;
int col[55][55],eff[55][55];
bool v_all_ok=1;
bool vis_del[55][55];
queue<pii> need_del;//需要删除的颜色 
int sum_col;//单轮中删除颜色的和 
pii main_col[15];//最近五轮主颜色 
bool check_have_three(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m-2;j++)
			if(col[i][j]==col[i][j+1] && col[i][j+1]==col[i][j+2] && col[i][j]!=0)
				return 1;
	for(int i=1;i<=n-2;i++)
		for(int j=1;j<=m;j++)
			if(col[i][j]==col[i+1][j] && col[i+1][j]==col[i+2][j] && col[i][j]!=0)
				return 1;
	return 0;
}
void light_three(){
	int col1=0,sum1=0,col2=0,sum2=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m-2;j++)
			if(col[i][j]==col[i][j+1] && col[i][j+1]==col[i][j+2] && col[i][j]!=0){
				if(col1==col[i][j] || col1==0){
					col1=col[i][j];
					if(!vis_del[i][j])sum1++,vis_del[i][j]=1,need_del.push(mp(i,j));
					if(!vis_del[i][j+1])sum1++,vis_del[i][j+1]=1,need_del.push(mp(i,j+1));
					if(!vis_del[i][j+2])sum1++,vis_del[i][j+2]=1,need_del.push(mp(i,j+2));
				}else{
					col2=col[i][j];
					if(!vis_del[i][j])sum2++,vis_del[i][j]=1,need_del.push(mp(i,j));
					if(!vis_del[i][j+1])sum2++,vis_del[i][j+1]=1,need_del.push(mp(i,j+1));
					if(!vis_del[i][j+2])sum2++,vis_del[i][j+2]=1,need_del.push(mp(i,j+2));
				}
			}
	for(int i=1;i<=n-2;i++)
		for(int j=1;j<=m;j++)
			if(col[i][j]==col[i+1][j] && col[i+1][j]==col[i+2][j] && col[i][j]!=0){
				if(col1==col[i][j] || col1==0){
					col1=col[i][j];
					if(!vis_del[i][j])sum1++,vis_del[i][j]=1,need_del.push(mp(i,j));
					if(!vis_del[i+1][j])sum1++,vis_del[i+1][j]=1,need_del.push(mp(i+1,j));
					if(!vis_del[i+2][j])sum1++,vis_del[i+2][j]=1,need_del.push(mp(i+2,j));
				}else{
					col2=col[i][j]; 
					if(!vis_del[i][j])sum2++,vis_del[i][j]=1,need_del.push(mp(i,j));
					if(!vis_del[i+1][j])sum2++,vis_del[i+1][j]=1,need_del.push(mp(i+1,j));
					if(!vis_del[i+2][j])sum2++,vis_del[i+2][j]=1,need_del.push(mp(i+2,j));
				} 
			}
	if(col1)score+=50*(sum1-3)*(sum1-3);
	if(col2)score+=50*(sum2-3)*(sum2-3);
	sum_col+=col1*sum1;
	sum_col+=col2*sum2;
	main_col[++cnt_main_col]=mp(col1,col2);
}
void del_effect(){
	while(!need_del.empty()){
		int ux=need_del.front().fi,uy=need_del.front().se;need_del.pop();
		if(eff[ux][uy]==1){
			for(int i=1;i<=uy;i++)
				if(col[ux][i]!=0 && !vis_del[ux][i])
					need_del.push(mp(ux,i)),vis_del[ux][i]=1,sum_col+=col[ux][i];
		}else if(eff[ux][uy]==2){
			for(int i=1;i<=ux;i++)
				if(col[i][uy]!=0 && !vis_del[i][uy])
					need_del.push(mp(i,uy)),vis_del[i][uy]=1,sum_col+=col[i][uy];
		}else if(eff[ux][uy]==3){
			for(int i=1;i<=uy;i++)
				if(col[ux][i]!=0 && !vis_del[ux][i])
					need_del.push(mp(ux,i)),vis_del[ux][i]=1,sum_col+=col[ux][i];
			for(int i=1;i<=ux;i++)
				if(col[i][uy]!=0 && !vis_del[i][uy])
					need_del.push(mp(i,uy)),vis_del[i][uy]=1,sum_col+=col[i][uy];
		}else if(eff[ux][uy]==4){
			for(int i=-1;i<=1;i++)
				for(int j=-1;j<=1;j++){
					int vx=ux+i,vy=uy+j;
					if(vx<1 || vx>n || vy<1 || vy>m)continue;
					if(col[vx][vy]!=0 && !vis_del[vx][vy])
						need_del.push(mp(vx,vy)),vis_del[vx][vy]=1,sum_col+=col[vx][vy];
				}
		}else if(eff[ux][uy]==5){
			for(int i=-2;i<=2;i++)
				for(int j=-2;j<=2;j++){
					int vx=ux+i,vy=uy+j;
					if(vx<1 || vx>n || vy<1 || vy>m)continue;
					if(col[vx][vy]!=0 && !vis_del[vx][vy])
						need_del.push(mp(vx,vy)),vis_del[vx][vy]=1,sum_col+=col[vx][vy];
				}
		}else if(eff[ux][uy]==6){
			for(int i=1;i<=n;i++)
				for(int j=1;j<=m;j++)
					if(col[i][j]==col[ux][uy] && !vis_del[i][j])
						need_del.push(mp(i,j)),vis_del[i][j]=1,sum_col+=col[i][j];
		}
	}
}
void fall_down(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(vis_del[i][j])
				col[i][j]=eff[i][j]=0;
	for(int i=1;i<=m;i++){
		int cnt_del=n;
		for(int j=n;j>=1;j--){
			if(col[j][i]==0)continue;
			col[cnt_del][i]=col[j][i];
			eff[cnt_del][i]=eff[j][i];
			cnt_del--;
		}
	}
}
void init(){
	sum_col=0;
	while(!need_del.empty())need_del.pop();
	memset(vis_del,0,sizeof(vis_del));
}
void work(){
	int x=0;//轮数 
	while(check_have_three()){
		init();//初始化所有数据 
		x++;
		light_three();//标记可删除,计算组合得分 
		del_effect();//根据特殊效果删除
		fall_down();//下落
		score+=sum_col*x;//消除得分 
	}
	score+=80*(x-1)*(x-1);//连锁得分 
}
int main_col_sum_new[15];
int main_col_sum[15],max_paix;
int calc_paix(){
	for(int i=1;i<=6;i++)main_col_sum_new[i]=main_col_sum[i];
	sort(main_col_sum_new+1,main_col_sum_new+1+6,cmp_bg_to_sm);
	if(main_col_sum_new[1]==1 && main_col_sum_new[2]==1  && main_col_sum_new[3]==1  && main_col_sum_new[4]==1  && main_col_sum_new[5]==1){
		for(int i=6;i>=1;i--)
			if(main_col_sum[i])
				return 50+i;
	}else if(main_col_sum_new[1]==2 && main_col_sum_new[2]==1 && main_col_sum_new[3]==1 && main_col_sum_new[4]==1){
		for(int i=1;i<=6;i++)
			if(main_col_sum[i]==2)
				return 100+2*i;
	}else if(main_col_sum_new[1]==2 && main_col_sum_new[2]==2 && main_col_sum_new[3]==1){
		int res_paix=200;
		for(int i=6;i>=1;i--)
			if(main_col_sum[i]==2){
				res_paix+=i*2;
				break;
			}
		for(int i=1;i<=6;i++)
			if(main_col_sum[i]==2){
				res_paix+=i;
				break;
			}
		return res_paix;
	}else if(main_col_sum_new[1]==3 && main_col_sum_new[2]==1 && main_col_sum_new[3]==1){
		for(int i=1;i<=6;i++)
			if(main_col_sum[i]==3)
				return 300+3*i;
	}else if(main_col_sum_new[1]==3 && main_col_sum_new[2]==2){
		int res_paix=500;
		for(int i=1;i<=6;i++)
			if(main_col_sum[i]==3)res_paix+=3*i;
			else if(main_col_sum[i]==2)res_paix+=i;
		return res_paix;
	}else if(main_col_sum_new[1]==4 && main_col_sum_new[2]==1){
		for(int i=1;i<=6;i++)
			if(main_col_sum[i]==4)
				return 750+i*5;
	}else if(main_col_sum_new[1]==5){
		for(int i=1;i<=6;i++)
			if(main_col_sum[i]==5)
				return 1000+i*10;
	}
}
void dfs_paix(int u){
	if(u==6){
		max_paix=max(max_paix,calc_paix());
		return ;
	}
	main_col_sum[main_col[u].fi]++;dfs_paix(u+1);main_col_sum[main_col[u].fi]--;
	if(main_col[u].se){
		main_col_sum[main_col[u].se]++;
		dfs_paix(u+1);
		main_col_sum[main_col[u].se]--;
	}
}
int get_paix(){
	max_paix=0;
	dfs_paix(1);
	return max_paix;
}
bool all_gone(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(col[i][j])
				return 0;
	return 1;
}
void get_final(){
	if(v_all_ok)score+=1000;
	if(all_gone())score+=10000;
}
int main(){
	scanf("%d%d%d%d",&n,&m,&k,&q);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&col[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&eff[i][j]);
	for(int i=1;i<=q;i++){
		int ux,uy,vx,vy;scanf("%d%d%d%d",&ux,&uy,&vx,&vy);
		swap(col[ux][uy],col[vx][vy]);
		swap(eff[ux][uy],eff[vx][vy]);
		if(!check_have_three()){
			swap(col[ux][uy],col[vx][vy]);
			swap(eff[ux][uy],eff[vx][vy]);
			v_all_ok=0;
			continue;
		}
		work();
		if(i%5==0)get_paix();//获取牌型得分 
	}
	get_final();//获取终局得分 
	printf("%d\n",score); 
	return 0;
}

开始调样例

标签:int,sum,消消,del,vx,德州,main,col,刷题
From: https://www.cnblogs.com/kentsbk/p/17788227.html

相关文章

  • 刷题记录-移除元素
    刷题记录-移除元素移除元素给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例......
  • CSP-S 2023 消消乐-题解
    CSP-S2023消消乐-题解闲话省流:longlong模拟pair好抽象的题,可惜考场上没做出来。感觉其实是一个挺有趣的题的。题目描述小L现在在玩一个低配版本的消消乐,该版本的游戏是一维的,一次也只能消除两个相邻的元素。现在,他有一个长度为\(n\)且仅由小写字母构成的字符串。我......
  • 前端歌谣的刷题之路-第五十七题-添加元素
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 前端歌谣的刷题之路-第五十八题-删除数组的最后一个元素
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 嵌入式面试刷题(day1)
    (文章目录)前言最近我打算出一套笔试刷题的总结,帮助大家解决一些笔试的经典和容易出错的题目,并且将这些知识点讲解明白。我将会在牛客网上刷题,节省大家的时间将最值得关注的题目呈现给大家。一、由for(;;)引出的一系列问题在C/C++的for循环中,我们可以省略循环语句的各个参......
  • 嵌入式刷题(day2 new delete 和malloc free的区别)
    (文章目录)前言本篇文章我们来讲解一下newdelete和mallocfree的区别,这个区别在许多面试题中也会经常问到,那么我们就具体的来看看他们有什么不同吧。一、区别new和delete是C++中的运算符,用于动态分配和释放内存空间,而malloc和free是C语言中的函数,用于同样的目的......
  • 【刷题笔记】91. Decode Ways
    题目Amessagecontaininglettersfrom A-Z isbeingencodedtonumbersusingthefollowingmapping:'A'->1'B'->2...'Z'->26Givena non-empty stringcontainingonlydigits,determinethetotalnumberofwayst......
  • 算法刷题记录-二分查找
    算法刷题记录-二分查找二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:......
  • 刷题小知识点巩固
    1.“A”==grade会比较地址值,String是引用类型;应该用equals去比较内容是否相等2.dowhile->先执行一次循环体,在执行条件3.varchar:存储可变长度字符串char:存储固定长度字符串4.arr1=arr.split("")返回将arr通过空格分割的数组arr1;5.文件拓展名是.txt这样6.大佬的正则:str.replace(/(......
  • 刷题记录——MISTAKES 慢慢更新
    刷题记录——MISTAKES慢慢更新截止到:20231020(有时会忘记改日期)。信友队——CSP-S2023复赛模拟赛T2忘了取模和二分了,直接爆longlong和TLE然后\(0\text{pts}\).CF1065CMakeItEqual桶桶桶桶桶!!!\(2e5\)你不用桶难道还要二分的吗?洛谷CSP-S2023模拟赛模\(9982443......