泡泡棋 从上往下掉落无法实现 只能从左往右掉落 希望有人来看一下 如果对了加我wx10元

**题目:
小 X 备完课后觉得肚子有点饿,就吃了点最喜欢的好多鱼,喝了厅联想佳沃的佳乐视蓝莓果汁保护下眼睛。看看时间离睡觉还有两个多小时,于是便打开 QQ 游戏,先下了局中国象棋,轻松获胜后心情大畅,又玩了会泡泡棋。 这个游戏在一个充满五彩缤纷的泡泡的长方形板上进行, 在每个回合,玩家选择一组相同颜色的泡泡(玩家只需用鼠标点击这组泡泡中的任意一个即可),之后这些被选中的泡泡就从板上消失了。那些不再被支撑着的气泡便会掉落。如果存在一个空行或空列,那么这个空行或空列将会被移除。 如下图所示:用鼠标点击黑色边框框起来的 7 个黑色泡泡中的任意一个,则框起来的 7 个黑色泡泡就会消失变成第二个图的样子,那些不再被支撑着的黑框中的气泡便会掉落,形成第三个图,第三个图有一个空列,移除这个空列后形成了最终的结果。 每一步的得分是被移除的泡泡的个数的平方。在上面的例子中,这一步的得分为 49
我的程序输出不是从上往下掉落的而是从右往左掉落的 **

(#include<bits/stdc++.h>
using namespace std;
int n,m,a[301][301],b[301][301],s=0,z;
int bx[6]={0,1,-1,0,0};
int by[6]={0,0,0,1,-1};
void dfs(int x,int y)
{
    int xx,yy;
    for(int i=1;i<=4;i++)
    {
        xx=x+bx[i];
        yy=y+by[i];
        if(xx<=n&&yy<=m&&xx>=0&&yy>=0&&a[xx][yy]==z)
        {
            a[xx][yy]=0;
            s++;
            dfs(xx,yy);
        }
    }
}
int main()
{
    int x,y,i,j;
    char d;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            cin>>d;
            a[i][j]=d-'0';
        }
    }
    cin>>x>>y;
    z=a[x][y];
    dfs(x,y);
    cout<<s*s<<endl;
    x=0;y=0;
    for(i=1;i<=n;i++)
    {
        ++x;
        for(j=1;j<=m;j++)
        {
            ++y;
            if(a[i][j]>0) b[x][y]=a[i][j];
        }
        y=0;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            cout<<b[i][j];
        }
        cout<<endl;
    }
    return 0;
 } 
)

输入:
3 5
31233
12211
33233
2 3

运行结果:
16
30330
11110
33330

我的:
16
31033
10011
33033

代码答案错误AC:30%

检查了好几次,我的深搜应该是没问题的,就是我的掉落有问题,不知道该如何实现从上往下掉落
想到了这个就是一个连通块和数组移动的组合可代码中还是实现不了

OK了铁汁们哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈我终于做出来了!!!!!看我代码
1.定义要long
2.判断只有一行的!!
我拿不到满分就是因为没有判断一行的
加油加油!
AC代码哦~~~~~~







#include <bits/stdc++.h>
using namespace std;
long n,m,s=0;
long c[305][305],b[305][305];
long bx,by,z;
int ex[5]={0,1,0,-1,0};
int ey[5]={0,0,1,0,-1};
void dfs(int x,int y)
{
    int xx,yy;
    for(int i=1;i<=4;i++)
    {
        xx=x+ex[i];
        yy=y+ey[i];
        if(xx<=n&&yy<=m&&xx>0&&yy>0&&c[xx][yy]==z)
        {
            c[xx][yy]=0;
            s++;
            dfs(xx,yy);
        }
    }
}
bool yu(int i) 
{
    for(int j=1;j<=m;j++) 
    {
        if(c[j][i])
            return false;
    }
    return 1;
}
void g(int k) 
{
    for(int i=1;i<=n;i++) 
    {
        for(int j=k;j<=m;j++) 
        {
            c[i][j]=c[i][j+1];
        }
    }
    return ;
}
void gt(int x,int y) 
{
    for(int i=x;i>=1;i--) 
    {
        c[i][y]=c[i-1][y];
    }
    return ;
}
int main() 
{    
    
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
    {
        for(int j=1;j<=m;j++)
        {
            char cc;
            cin>>cc;
            c[i][j]=cc-'0';
        }
    }
    cin>>bx>>by;
    z=c[bx][by];
    dfs(bx,by);
    cout<<s*s<<endl;
    if(n==1)
    {
        int x=0,y=0;
            for(int j=1;j<=m;j++)
            {
                if(c[1][j]!=0) b[1][++y]=c[1][j];
            }
            for(int j=1;j<=m;j++)
            {
                cout<<b[1][j];    
            }
            cout<<endl;
        return 0;
    }
    
    
    for(int i=1;i<=n;i++) 
    {
        if(yu(i)) 
            g(i);
    }
    for(int i=1;i<=n;i++) 
    {
        for(int j=1;j<=m;j++) 
        {
            if(c[i][j]==0) 
            {
                gt(i,j);
            }
        }
    }
    for(int i=1;i<=n;i++) 
    {
        for(int j=1;j<=m;j++)
            cout<<c[i][j];
        cout<<endl;
    }
    return 0;
}