泡泡棋

内存限制: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;
}
```
posted @ 2021-02-27 11:44  黄逸飞重庆八中  阅读(199)  评论(0编辑  收藏  举报