泡泡棋
内存限制:128 MiB时间限制:1000 ms输入文件:bubble.in输出文件:bubble.out
题目类型:传统评测方式:文本比较
题目描述
小 X备完课后觉得肚子有点饿,就吃了点最喜欢的好多鱼,喝了厅联想佳沃的佳乐视蓝莓果汁保护下眼睛。看看时间离睡觉还有两个多小时,于是便打开游戏,先下了局中国象棋,轻松获胜后心情大畅,又玩了会泡泡棋。这个游戏在一个充满五彩缤纷的泡泡的长方形板上进行,在每个回合,玩家选择一组相同颜色的泡泡(玩家只需用鼠标点击这组泡泡中的任意一个即可),之后这些被选中的泡泡就从板上消失了。那些不再被支撑着的气泡便会掉落。如果存在一个空行或空列,那么这个空行或空列将会被移除。如下图所示:用鼠标点击黑色边框框起来的 个黑色泡泡中的任意一个,则框起来的个黑色泡泡就会消失变成第二个图的样子,那些不再被支撑着的黑框中的气泡便会掉落,形成第三个图,第三个图有一个空列,移除这个空列后形成了最终的结果。
每一步的得分是被移除的泡泡的个数的平方。在上面的例子中,这一步的得分为 。
输入格式
第一行包含两个整数 ,表示长方形板的行数和列数。
接下来 行每行包含一个长度为 的由 构成的字符串,其中 每个数字表示一种颜色的泡泡,表示空白方格,即该方格没有泡泡。 最后一行包含两个整数 和 ,表示鼠标点击的位置。位置用行和列表示,行从上往下编号,列从左向右编号,上图初始状态的第一行第一列即左上角的位置为空白方格,第一行第二列有一个白色泡泡,第二行第三列有一个灰色泡泡,第四行第五列有一个黑色泡泡。
输出格式
第一行输出得分。 紧接着的 行输出方案,每行连续输出 个数字,没有泡泡的地方用 表示。
样例
样例输入1:
3 5
31233
12211
33233
2 3
样例输出1:
16
30330
11110
33330
样例输入2:
4 6
012312
312332
223321
231332
1 4
样例输出2:
复制49
010020
312020
222110
231220
数据范围与提示
数据范围:1<=m,n<=300
c++AC代码
```cpp
#include<bits/stdc++.h>
using namespace std;
int m,n,row,col,dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}},tot;
char a[305][305];
bool flag[305][305];
inline void dfs(int x,int y,char z){
flag[x][y]=true;//如果附近不存在该字符
for(int i=0;i<=3;i++){
int dx=x+dir[i][0],dy=y+dir[i][1];
if(dx>=1&&dx<=m&&dy>=1&&dy<=n&&a[dx][dy]==z&&!flag[dx][dy]){
flag[dx][dy]=true;
dfs(dx,dy,z);
}
}
}
int main(){
freopen("bubble.in","r",stdin);
freopen("bubble.out","w",stdout);
memset(a,'0',sizeof(a));
scanf("%d %d",&m,&n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("\n%c",&a[i][j]);
}
}
scanf("%d %d",&row,&col);
dfs(row,col,a[row][col]);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(flag[i][j])a[i][j]='a',tot++;
}
}
printf("%d\n",tot*tot);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[j][i]=='a'){
if(j==1){
a[1][i]='0';
continue;
}
for(int q=j;q>=1;q--){
a[q][i]=a[q-1][i];
}
a[1][i]='0';
}
}
}
for(int i=1;i<=n;i++){
bool _flag=true;
for(int j=1;j<=m;j++){
if(a[j][i]!='0'){
_flag=false;
break;
}
}
if(_flag){
for(int j=i;j<=n;j++){
for(int q=1;q<=m;q++){
swap(a[q][j],a[q][j+1]);
}
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
printf("%c",a[i][j]);
}
printf("\n");
}
return 0;
}
```