3663 - 开心消消乐
消消乐是一款老少皆宜的游戏,玩法也多种多样,现在我们这款消消乐在 6*6 格子的游戏池中进行。每个格子中
有一个数字表示方块,每种数字代表不同的方块类型。鼠标点击格子中的方块,如果该方块相连有4个或以上
(总的相同方块数>=5)的相同种方块,则可以消去该方块极其周围与该方块相连的方块。消去方块后原来有方
块的位置变成空白区域,空白区域上方的方块受到引力作用回向下落,下落完成以后,如果新的6*6方格中有空
白列,则空白列右边的所有方块向左移动,直到与左边的方块对接。给定原来的6*6方格和鼠标点击位置,要求
输出消去后的6*6方格,如果不能消去,则直接输出”Can’t”
<span></span>
Input
每个测试7行,第1行两个数n,m(中间用空格分开)分别表示鼠标点击的行列坐标,后6行每行六个数,表示方块
原来的位置,每种数表示一种方块,保证方块种类只有1 2 3 4 5这五种,输入时两个数间没有空格
<span></span>
Output
对于每个测试数据,如果可以消去,则输出消去后的6*6方格,空白区域用0表示,两种方格之间不要有空格;如
果不能消去,则直接输出”Can’t”
Examples
Input
1 1 123121 111312 321321 253123 321123 222312 3 3 111111 221122 331133 111113 331333 121343
Output
000121 020312 323321 253123 321123 222312 000000 000020 220230 330330 333330 123430
Solution C
#include<stdio.h> int x[6][6],t,c; void xiao(int m,int n) { if(m>0&&x[m-1][n]==t){c++;x[m-1][n]=0;xiao(m-1,n);} if(m<5&&x[m+1][n]==t){c++;x[m+1][n]=0;xiao(m+1,n);} if(n>0&&x[m][n-1]==t){c++;x[m][n-1]=0;xiao(m,n-1);} if(n<5&&x[m][n+1]==t){c++;x[m][n+1]=0;xiao(m,n+1);} } void he1() { int i,j,k; for(k=0;k<5;k++) for(i=5;i>0;i--) for(j=0;j<=5;j++) if(x[i][j]==0) { x[i][j]=x[i-1][j]; x[i-1][j]=0; } } void he2() { int i,j,k,l; for(l=0;l<5;l++) for(j=0;j<5;j++) for(i=0;i<6;i++) { if(x[i][j]!=0)break; if(i==5) for(k=0;k<6;k++) { x[k][j]=x[k][j+1]; x[k][j+1]=0; } } } void p() { int i,j; for(i=0;i<6;i++) { for(j=0;j<6;j++) printf("%d",x[i][j]); printf("\n"); } } int main() { int i,j,n,m; // freopen("test.in","r",stdin); // freopen("test.out","w",stdout); while(scanf("%d%d",&m,&n)==2) { for(i=0;i<6;i++) for(j=0;j<6;j++) scanf("%1d",&x[i][j]); m--;n--; t=x[m][n];x[m][n]=0; c=1;xiao(m,n); if(c>=5){he1();he2();p();}else printf("Can't\n"); } return 0; }
Solution C++
#include <bits/stdc++.h> using namespace std; int d[10][10]; int dd; void dfs(int x,int y,int data){ if ((x<1||x>6||y<1||y>6||d[x][y]!=data)) return; dd++; d[x][y]=0; dfs(x-1,y,data); dfs(x+1,y,data); dfs(x,y-1,data); dfs(x,y+1,data); } void move(){ for (int i=6;i>=2;i--){ for (int s=1;s<=6;s++){ if (d[i][s]==0){ swap(d[i][s],d[i-1][s]); } } } for (int i=1;i<6;i++){ int ok=1; for (int s=1;s<=6;s++){ if (d[s][i]!=0){ ok=0; } } if (ok){ for (int s=1;s<=6;s++){ swap(d[s][i],d[s][i+1]); } ok=0; } } } void print(){ for (int i=1;i<=6;i++){ for (int s=1;s<=6;s++){ printf("%d",d[i][s]); } printf("\n"); } } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ dd=0; char as[10][10]; for (int i=1;i<=6;i++){ scanf("%s",as[i]); } for (int i=1;i<=6;i++){ for (int s=0;s<6;s++){ d[i][s+1]=as[i][s]-'0'; } } dfs(n,m,d[n][m]); if (dd<=4){ printf("Can't\n"); continue; } for (int i=0;i<6;i++) move(); print(); } return 0; }