Cod sursa(job #1226659)

Utilizator edihackpackEdi Pop edihackpack Data 6 septembrie 2014 17:32:42
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.01 kb
#include <cstdio>
#include <climits>
#include <conio.h>
void citeste();


struct pozitie{int x,y;};

void genereaza(int,int);
bool vizitat[1000][1000];
int mat[1001][1001];
int unda[1001][1001];
int n,m;
pozitie inceput;
pozitie sfarsit;
bool cautadrum(int dist, pozitie a, pozitie b)
{
    if(a.x == b.x && a.y == b.y)
        return true;

    vizitat[a.x][a.y] = true;

    a.x++;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.x--;

    a.y++;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.y--;

    a.x--;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.x++;

    a.y--;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.y++;

    a.x++;
    a.y++;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.y--;
    a.x--;

    a.x++;
    a.y--;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.y++;
    a.x--;

    a.x--;
    a.y++;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.y--;
    a.x++;

    a.x--;
    a.y--;
    if(a.x<n)
        if(unda[a.x][a.y] == dist)
            if(mat[a.x][a.y] != 1)
                if(!vizitat[a.x][a.y])
                    cautadrum(dist,a,b);
    a.y++;
    a.x++;

    vizitat[a.x][a.y] = false;
}

int max = -INT_MAX;

int main()
{
    citeste();


  /*  for(int i=0; i<n; i++)
    {
        for(int j =0; j<m; j++)
            printf("%d ",unda[i][j]);
        printf("\n");
    }
    printf("\n\n");*/

    freopen("barbar.out","w",stdout);
    max = (unda[inceput.x][inceput.y]>unda[sfarsit.x][sfarsit.y])?unda[sfarsit.x][sfarsit.y]:unda[inceput.x][inceput.y];
    for(int i = max; i>=1; i--)
        if(cautadrum(i,inceput, sfarsit))
        {
            printf("%d ",i);
            return 0 ;
        }
    printf("%d",-1);



}


void citeste()
{
    freopen("barbar.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=0; i<n; i++)
        for(int j =0; j<m; j++)
            unda[i][j] = INT_MAX;
    char x;
    for(int i =0; i<n; i++)
        for(int j =0; j<m; j++)
        {
            scanf("%c",&x);
            switch(x)
            {
                case '.':{mat[i][j] = 0;break;}
                case '*':{mat[i][j] = 1; inceput.x = i; inceput.y= j;break;}
                case 'D':{mat[i][j] = 2; unda[i][j] = 0;genereaza(i,j);break;}
                case '0':{mat[i][j] = 3; sfarsit.x = i; sfarsit.y= j;break;}
                default:mat[i][j] = 4;
            }
        }
    fclose(stdin);
}
void genereaza(int x, int y)
{
    bool mod = false;
    int distanta = 1;
    do
    {
        mod = false;
        for(int i =x-distanta; i<=x+distanta;i++)
            for(int j = y-distanta; j<=y+distanta;j++)
                if(!(x == i && y ==j) && unda[i][j]>distanta && i<n && i>=0 && j<m && j>=0)
                {
                    mod = true;
                    unda[i][j] = distanta;
                }
        distanta++;
    }
    while(mod);

/*            for(int i =0; i<n; i++)
    {
        for(int j =0; j<m; j++)
            if(unda[i][j]!=INT_MAX)
            printf("%d ",unda[i][j]);
        else
            printf("0 ");
        printf("\n");
    }
    printf("\n");
    getch();*/

}