Cod sursa(job #1363677)

Utilizator andi12Draghici Andrei andi12 Data 27 februarie 2015 09:54:29
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
using namespace std;
const int N=1000;
int mat[N+5][N+5],n,m,x1,x2,y1,y2;
int f[N+5][N+5];
struct poz
{
    int x;
    int y;
};
poz v[N*N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int intem(int x,int y)
{
    if(x>=1 && y<=m && x<=n && y>=1)
        return 1;
    else
        return 0;
}
void lee(int u)
{
    int p=1,k,x,y;
    while(p<=u)
    {
        for(k=0;k<=3;k++)
        {
            x=v[p].x+dx[k];
            y=v[p].y+dy[k];
            if(intem(x,y)==1 && mat[x][y]==0)
            {
                mat[x][y]=mat[v[p].x][v[p].y]+1;
                u++;
                v[u].x=x;
                v[u].y=y;
            }
        }
        p++;
    }
}
int min(int a,int b)
{
    if(a<=b)
        return a;
    else
        return b;
}
int fil(int d,int x,int y)
{
    int i,j,k,ok=0;
    f[x][y]=1;
    for(k=0;k<=3;k++)
    {
        i=x+dx[k];
        j=y+dy[k];
        if(intem(i,j)==1 && f[i][j]==0 && mat[i][j]!=-1)
        {
            if(mat[i][j]>=d)
                fil(d,i,j);
        }
    }
    if(mat[x1][y1]<d || mat[x2][y2]<d)
        return 0;
    else
    {
        return f[x2][y2];
    }
}
void cler()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f[i][j]=0;
}
int cautbin()
{
    int pas=1<<11,d=0;
    while(pas>min(n,m))
        pas=pas/2;
    while(pas>=1)
    {
        cler();
        if(fil(d+pas,x1,y1)==1)
            d=d+pas;
        pas=pas/2;
    }
    return d;
}
int main()
{
    ifstream in("barbar.in");
    ofstream out("barbar.out");
    int i,j,fin=0,d;
    char c;
    in>>n>>m>>ws;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            in>>c>>ws;
            if(c=='*')
                mat[i][j]=-1;
            if(c=='I')
            {
                x1=i;
                y1=j;
            }
            if(c=='O')
            {
                x2=i;
                y2=j;
            }
            if(c=='D')
            {
                fin++;
                v[fin].x=i;
                v[fin].y=j;
                mat[i][j]=1;
            }
        }
    lee(fin);
    d=cautbin();
    out<<d-1;
    return 0;
}