Cod sursa(job #874573)

Utilizator andreii1Ilie Andrei andreii1 Data 8 februarie 2013 20:48:11
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <cstdio>

using namespace std;

int n,m,i,j,sol,x,y,v[52][52],nr,max,as,b;
char a[52][52],c;
int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};

int verif(int x1,int y1,int x2, int y2)
{
    if(x2>=1&&x2<=n&&y2>=1&&y2<=m)
    if(a[x1][y1]==a[x2][y2]&&v[x2][y2]!=-1)
    return 1;
    return 0;
}

int verif2(int x1,int y1,int x2, int y2)
{
    if(x2>=1&&x2<=n&&y2>=1&&y2<=m)
    if(a[x1][y1]==a[x2][y2]&&v[x2][y2]!=-2)
    return 1;
    return 0;
}

void fill(int x,int y)
{
    int i;
    nr++;
    v[x][y]=-1;
    for(i=1;i<=4;i++)if(verif(x,y,x+dx[i],y+dy[i])) fill(x+dx[i],y+dy[i]);
}

void sterge(int x,int y)
{
    int i;
    v[x][y]=-2;
    for(i=1;i<=4;i++)if(verif2(x,y,x+dx[i],y+dy[i]))sterge(x+dx[i],y+dy[i]);
    a[x][y]='*';
}

int gol()
{
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    if(a[i][j]!='*'&&a[i][j]!=NULL) return 0;
    return 1;
}

int empty(int col)
{
    int i;
    for(i=1;i<=n;i++)if(a[i][col]!='*')return 0; return 1;
}

void copy(int x,int y)
{
    int i;
    if(y<=m)
    {
    if(empty(y))copy(x,y+1);
    else for(i=1;i<=n;i++){a[i][x]=a[i][y];a[i][y]='*';}
    }
}

int cade(int x,int y)
{
    int p=x,u=y;
    x++;
    while(a[x][y]=='*'&&x<=n)x++;
    a[x-1][y]=a[p][u];
    a[p][u]='*';
}

int main()
{
    FILE *f=fopen("adunare.in","r");
    FILE *g=fopen("adunare.out","w");
    //fscanf(f,"%d %d",&n,&m);
    //fscanf(f,"%c",&c);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)fscanf(f,"%c",&a[i][j]);
        fscanf(f,"%c",&c);
    }
    fscanf(f,"%d %d",&as,&b);
    while(!gol())
    {
        max=0;
        sol++;
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        if(a[i][j]=='*')v[i][j]=-1;else v[i][j]=0;
        for(j=1;j<=m;j++)
        for(i=n;i>=1;i--)
        if(v[i][j]!=-1)
        {
            nr=0;
            fill(i,j);
            if(nr>max){max=nr;x=i;y=j;}
        }
        sterge(x,y);
        for(j=1;j<=m;j++)
        {
            for(i=n-1;i>=1;i--)
            if(a[i][j]!='*'&&a[i+1][j]=='*')cade(i,j);
        }
        for(j=1;j<=m;j++) if(empty(j)) copy(j,j+1);
    }
    sol=as+b;
    fprintf(g,"%d",sol);
    fclose(f);
    fclose(g);
    return 0;
}