刷题-德州消消乐
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;
}
开始调样例
2023/10/25 22:21调出第一个样例
#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 rond){
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);
// printf("We get %d scores from C\n",50*(sum1-3)*(sum1-3));
}
if(col2){
score+=50*(sum2-3)*(sum2-3);
// printf("We get %d scores from C\n",50*(sum2-3)*(sum2-3));
}
sum_col+=col1*sum1;
sum_col+=col2*sum2;
if(rond==1)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<=m;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<=n;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<=m;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<=n;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];
if(j!=cnt_del)col[j][i]=eff[j][i]=0;
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(x);//标记可删除,计算组合得分
// puts("-------------------------\nafter light three");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
del_effect();//根据特殊效果删除
// puts("-------------------------\nafter del effect");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
// printf("We get %d scores from A\n",sum_col*x);
fall_down();//下落
score+=sum_col*x;//消除得分
}
score+=80*(x-1)*(x-1);//连锁得分
// printf("We get %d score from B\n",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]--;
}
}
void get_paix(){
// printf("now we get %d scores in all\n",score);
// printf("The main col is:\n");
// for(int i=1;i<=5;i++)printf("%d %d\n",main_col[i].fi,main_col[i].se);
max_paix=0;
dfs_paix(1);
cnt_main_col=0;
score+=max_paix;
// printf("We get %d score from D\n",max_paix);
// printf("now we get %d scores in all\n",score);
}
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();
// puts("--------------------------------------------------");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)printf("%d ",col[i][j]);
// puts("");
// }
if(i%5==0)get_paix();//获取牌型得分
}
get_final();//获取终局得分
printf("%d\n",score);
return 0;
}
2023/10/15 22:40调出所有样例 and WA on #6
#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],vis_score[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;
}
int walk[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sum_con;
void dfs_zuhe(int ux,int uy){
sum_con++;
vis_score[ux][uy]=1;
for(int i=0;i<4;i++){
int vx=ux+walk[i][0],vy=uy+walk[i][1];
if(vis_del[vx][vy] && !vis_score[vx][vy] && col[vx][vy]==col[ux][uy])dfs_zuhe(vx,vy);
}
}
void get_zuhe(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j] && !vis_score[i][j]){
sum_con=0;
dfs_zuhe(i,j);
score+=50*(sum_con-3)*(sum_con-3);
}
}
void light_three(int rond){
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));
}
}
memset(vis_score,0,sizeof(vis_score));
get_zuhe();
if(rond==1)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<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
}else if(eff[ux][uy]==2){
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}else if(eff[ux][uy]==3){
for(int i=1;i<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}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;
}
}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;
}
}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;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j])
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];
if(j!=cnt_del)col[j][i]=eff[j][i]=0;
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(x);//标记可删除,计算组合得分
// puts("-------------------------\nafter light three");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
del_effect();//根据特殊效果删除
// puts("-------------------------\nafter del effect");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
// printf("We get %d scores from A\n",sum_col*x);
fall_down();//下落
score+=sum_col*x;//消除得分
}
score+=80*(x-1)*(x-1);//连锁得分
// printf("We get %d score from B\n",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]--;
}
}
void get_paix(){
// printf("now we get %d scores in all\n",score);
// printf("The main col is:\n");
// for(int i=1;i<=5;i++)printf("%d %d\n",main_col[i].fi,main_col[i].se);
max_paix=0;
dfs_paix(1);
cnt_main_col=0;
score+=max_paix;
// printf("We get %d score from D\n",max_paix);
// printf("now we get %d scores in all\n",score);
}
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 sum_ok_op;
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;
}
sum_ok_op++;
work();
// puts("--------------------------------------------------");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)printf("%d ",col[i][j]);
// puts("");
// }
if(sum_ok_op%5==0)get_paix();//获取牌型得分
}
get_final();//获取终局得分
printf("%d\n",score);
return 0;
}
调完#6 and WA on #7
#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],vis_score[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;
}
int walk[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sum_con;
void dfs_zuhe(int ux,int uy){
sum_con++;
vis_score[ux][uy]=1;
for(int i=0;i<4;i++){
int vx=ux+walk[i][0],vy=uy+walk[i][1];
if(vis_del[vx][vy] && !vis_score[vx][vy] && col[vx][vy]==col[ux][uy])dfs_zuhe(vx,vy);
}
}
void get_zuhe(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j] && !vis_score[i][j]){
sum_con=0;
dfs_zuhe(i,j);
score+=50*(sum_con-3)*(sum_con-3);
// printf("We get %d scores from C",50*(sum_con-3)*(sum_con-3));
}
}
void light_three(int rond){
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));
}
}
memset(vis_score,0,sizeof(vis_score));
get_zuhe();
if(rond==1)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<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
}else if(eff[ux][uy]==2){
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}else if(eff[ux][uy]==3){
for(int i=1;i<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}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;
}
}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;
}
}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;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j])
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];
if(j!=cnt_del)col[j][i]=eff[j][i]=0;
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(x);//标记可删除,计算组合得分
// puts("-------------------------\nafter light three");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
del_effect();//根据特殊效果删除
// puts("-------------------------\nafter del effect");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
// printf("We get %d scores from A\n",sum_col*x);
fall_down();//下落
score+=sum_col*x;//消除得分
}
score+=80*(x-1)*(x-1);//连锁得分
// printf("We get %d score from B\n",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]--;
}
}
void get_paix(){
// printf("now we get %d scores in all\n",score);
// printf("The main col is:\n");
// for(int i=1;i<=5;i++)printf("%d %d\n",main_col[i].fi,main_col[i].se);
max_paix=0;
dfs_paix(1);
cnt_main_col=0;
score+=max_paix;
// printf("We get %d scores from D\n",max_paix);
// printf("now we get %d scores in all\n",score);
}
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 sum_ok_op;
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() || col[ux][uy]==0 || col[vx][vy]==0){
swap(col[ux][uy],col[vx][vy]);
swap(eff[ux][uy],eff[vx][vy]);
v_all_ok=0;
continue;
}
sum_ok_op++;
work();
// puts("--------------------------------------------------");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)printf("%d ",col[i][j]);
// puts("");
// }
if(sum_ok_op%5==0)get_paix();//获取牌型得分
}
get_final();//获取终局得分
printf("%d\n",score);
return 0;
}
2023/10/25 22:50 调出#7 and WA on #7
#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],vis_score[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;
}
int walk[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sum_con;
void dfs_zuhe(int ux,int uy){
sum_con++;
vis_score[ux][uy]=1;
for(int i=0;i<4;i++){
int vx=ux+walk[i][0],vy=uy+walk[i][1];
if(vis_del[vx][vy] && !vis_score[vx][vy] && col[vx][vy]==col[ux][uy])dfs_zuhe(vx,vy);
}
}
void get_zuhe(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j] && !vis_score[i][j]){
sum_con=0;
dfs_zuhe(i,j);
score+=50*(sum_con-3)*(sum_con-3);
// printf("We get %d scores from C",50*(sum_con-3)*(sum_con-3));
}
}
void light_three(int rond){
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));
}
}
memset(vis_score,0,sizeof(vis_score));
get_zuhe();
if(rond==1)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<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
}else if(eff[ux][uy]==2){
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}else if(eff[ux][uy]==3){
for(int i=1;i<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}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;
}
}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;
}
}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;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j])
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];
if(j!=cnt_del)col[j][i]=eff[j][i]=0;
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(x);//标记可删除,计算组合得分
// puts("-------------------------\nafter light three");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
del_effect();//根据特殊效果删除
// puts("-------------------------\nafter del effect");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
// printf("We get %d scores from A\n",sum_col*x);
fall_down();//下落
score+=sum_col*x;//消除得分
}
score+=80*(x-1)*(x-1);//连锁得分
// printf("We get %d score from B\n",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]--;
}
}
void get_paix(){
// printf("now we get %d scores in all\n",score);
// printf("The main col is:\n");
// for(int i=1;i<=5;i++)printf("%d %d\n",main_col[i].fi,main_col[i].se);
max_paix=0;
dfs_paix(1);
cnt_main_col=0;
score+=max_paix;
// printf("We get %d scores from D\n",max_paix);
// printf("now we get %d scores in all\n",score);
}
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 sum_ok_op;
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() || col[ux][uy]==0 || col[vx][vy]==0 || abs(ux-vx)+abs(uy-vy)!=1){
swap(col[ux][uy],col[vx][vy]);
swap(eff[ux][uy],eff[vx][vy]);
v_all_ok=0;
continue;
}
sum_ok_op++;
work();
// puts("--------------------------------------------------");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)printf("%d ",col[i][j]);
// puts("");
// }
if(sum_ok_op%5==0)get_paix();//获取牌型得分
}
get_final();//获取终局得分
printf("%d\n",score);
return 0;
}
2023/10/25 22:56 AC!!!
#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],vis_score[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;
}
int walk[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sum_con;
void dfs_zuhe(int ux,int uy){
sum_con++;
vis_score[ux][uy]=1;
for(int i=0;i<4;i++){
int vx=ux+walk[i][0],vy=uy+walk[i][1];
if(vis_del[vx][vy] && !vis_score[vx][vy] && col[vx][vy]==col[ux][uy])dfs_zuhe(vx,vy);
}
}
void get_zuhe(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j] && !vis_score[i][j]){
sum_con=0;
dfs_zuhe(i,j);
score+=50*(sum_con-3)*(sum_con-3);
// printf("We get %d scores from C",50*(sum_con-3)*(sum_con-3));
}
}
void light_three(int rond){
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));
}
}
memset(vis_score,0,sizeof(vis_score));
get_zuhe();
if(rond==1)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<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
}else if(eff[ux][uy]==2){
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}else if(eff[ux][uy]==3){
for(int i=1;i<=m;i++)
if(col[ux][i]!=0 && !vis_del[ux][i])
need_del.push(mp(ux,i)),vis_del[ux][i]=1;
for(int i=1;i<=n;i++)
if(col[i][uy]!=0 && !vis_del[i][uy])
need_del.push(mp(i,uy)),vis_del[i][uy]=1;
}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;
}
}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;
}
}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;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis_del[i][j])
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];
if(j!=cnt_del)col[j][i]=eff[j][i]=0;
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(x);//标记可删除,计算组合得分
// puts("-------------------------\nafter light three");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
del_effect();//根据特殊效果删除
// puts("-------------------------\nafter del effect");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)cout<<vis_del[i][j]<<" ";
// cout<<'\n';
// }
// printf("We get %d scores from A\n",sum_col*x);
fall_down();//下落
score+=sum_col*x;//消除得分
}
score+=80*(x-1)*(x-1);//连锁得分
// printf("We get %d score from B\n",80*(x-1)*(x-1));
}
int main_col_sum_new[105];
int main_col_sum[105],max_paix;
int calc_paix(){
for(int i=1;i<=k;i++)main_col_sum_new[i]=main_col_sum[i];
sort(main_col_sum_new+1,main_col_sum_new+1+k,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=k;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<=k;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=k;i>=1;i--)
if(main_col_sum[i]==2){
res_paix+=i*2;
break;
}
for(int i=1;i<=k;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<=k;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<=k;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<=k;i++)
if(main_col_sum[i]==4)
return 750+i*5;
}else if(main_col_sum_new[1]==5){
for(int i=1;i<=k;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]--;
}
}
void get_paix(){
// printf("now we get %d scores in all\n",score);
// printf("The main col is:\n");
// for(int i=1;i<=5;i++)printf("%d %d\n",main_col[i].fi,main_col[i].se);
max_paix=0;
dfs_paix(1);
cnt_main_col=0;
score+=max_paix;
// printf("We get %d scores from D\n",max_paix);
// printf("now we get %d scores in all\n",score);
}
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 sum_ok_op;
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() || col[ux][uy]==0 || col[vx][vy]==0 || abs(ux-vx)+abs(uy-vy)!=1){
swap(col[ux][uy],col[vx][vy]);
swap(eff[ux][uy],eff[vx][vy]);
v_all_ok=0;
continue;
}
sum_ok_op++;
work();
// puts("--------------------------------------------------");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)printf("%d ",col[i][j]);
// puts("");
// }
if(sum_ok_op%5==0)get_paix();//获取牌型得分
}
get_final();//获取终局得分
printf("%d\n",score);
return 0;
}