Cod sursa(job #2282670)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 14 noiembrie 2018 11:50:40
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.7 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("joc11.in");
ofstream g("joc11.out");

int nr,NR,n,V[60],m;
char b[60][60],a[60][60];




void collapse ()
{

    int i,j,k;

    for(j=1; j<=m; j++)
    {

        int cp=V[j],cpfin=cp;

        for(i=n; i>=(n-cp); i--)
        {

            if(a[i][j]=='0')
            {


                for(k=i-1; k>=(n-cp); k--)
                    a[k+1][j]=a[k][j];
                cpfin--;
                i++;
                cp--;


                    for(int l=1;l<=n;l++)
                        {for(int c=1;c<=m;c++)
                            cout<<a[l][c]<<" ";
                            cout<<'\n';
                        }
                        cout<<'\n';

            }
        }
        V[j]=cp;
    }






    for(j=1; j<=m; j++)
    {

        if(V[j]+1==0)
        {
            for(i=0; i<=n+1; i++)
            {
                for(k=j+1; k<=m; k++)
                    a[i][k-1]=a[i][k];
            }

            for(k=j+1; k<=m; k++)
                V[k-1]=V[k];
            j--;
            m--;
        }

    }



}






void fil (int x,int y,char c)
{
    // cout<<x<<" "<<y<<" "<<b[x][y]<<'\n';
    b[x][y]='0';
    nr++;
    if(b[x+1][y]==c)
    {
        fil(x+1,y,c);
    }
    if(b[x-1][y]==c)
    {
        fil(x-1,y,c);
    }
    if(b[x][y+1]==c)
    {
        fil(x,y+1,c);
    }
    if(b[x][y-1]==c)
    {
        fil(x,y-1,c);
    }
}

void fil1 (int x,int y,char c)
{
    a[x][y]='0';
    if(a[x+1][y]==c)
    {
        fil1(x+1,y,c);
    }
    if(a[x-1][y]==c)
    {
        fil1(x-1,y,c);
    }
    if(a[x][y+1]==c)
    {
        fil1(x,y+1,c);
    }
    if(a[x][y-1]==c)
    {
        fil1(x,y-1,c);
    }
}

int i,ok,maxim,poz1,poz2,j;
char c;
int main()
{
    f>>n>>m;


    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            f>>a[i][j];
            V[j]=n;
        }



    for(i=0; i<=n+1; i++)
    {
        a[i][0]='0';
        a[i][m+1]='0';
    }
    for(j=0; j<=m+1; j++)
    {
        a[0][j]='0';
        a[n+1][j]='0';
    }

    ok=1;
    while(ok)
    {

        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
                b[i][j]=a[i][j];

        maxim=0;

        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
            {
                if(b[i][j]!='0')
                {

                    nr=0;
                    fil(i,j,b[i][j]);

                    if(nr>maxim&&nr>=2)
                    {

                        maxim=nr;
                        poz1=i;
                        poz2=j;
                    }
                }
            }


        if(maxim==0)
        {
            ok=0;
            break;
        }

          /*for(i=1;i<=n;i++)
          {
              for(j=1;j<=m;j++)
                  cout<<a[i][j]<<" ";
              cout<<'\n';
          }
          cout<<'\n';

          cout<<poz1<<" "<<poz2<<'\n';
          */

        fil1(poz1,poz2,a[poz1][poz2]);
            /*for(i=1;i<=n;i++)
                {
                    for(j=1;j<=m;j++)
                        cout<<a[i][j]<<" ";
                    cout<<'\n';
                }

                cout<<'\n';
*/
        collapse();
/*
               cout<<n<<'\n';
                for(i=1;i<=n;i++)
                {
                    for(j=1;j<=m;j++)
                        cout<<a[i][j]<<" ";
                    cout<<'\n';
                }
                cout<<'\n';

           cout<<"--------------------------------------------"<<'\n';
*/
        NR++;
    }


    g<<NR;
    return 0;
}