Cod sursa(job #838267)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 19 decembrie 2012 10:48:18
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.59 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAX 2147483647
using namespace std;
int r,c,px,py,fx,fy,a[1010][1010],xd[1010],yd[1010],poz=1,c2[2][1000001],aux[1010][1010];

void marcare(int x)
{
    a[xd[x]][yd[x]]=0;
    int dr=1;
    c2[0][1]=xd[x];
    c2[1][1]=yd[x];
    for(int i=1;i<=dr;i++)
    {
        if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]+1][c2[1][i]])
        {
            a[c2[0][i]+1][c2[1][i]]=a[c2[0][i]][c2[1][i]]+1;
            c2[0][++dr]=c2[0][i]+1;
            c2[1][dr]= c2[1][i];
        }
        if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]-1][c2[1][i]])
        {
            a[c2[0][i]-1][c2[1][i]]=a[c2[0][i]][c2[1][i]]+1;
            c2[0][++dr]=c2[0][i]-1;
            c2[1][dr]= c2[1][i];
        }
        if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]][c2[1][i]+1])
        {
            a[c2[0][i]][c2[1][i]+1]=a[c2[0][i]][c2[1][i]]+1;
            c2[0][++dr]=c2[0][i];
            c2[1][dr]= c2[1][i]+1;
        }
        if(a[c2[0][i]][c2[1][i]]+1<a[c2[0][i]][c2[1][i]-1])
        {
            a[c2[0][i]][c2[1][i]-1]=a[c2[0][i]][c2[1][i]]+1;
            c2[0][++dr]=c2[0][i];
            c2[1][dr]= c2[1][i]-1;
        }
    }

}

int bun(int t)
{
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            aux[i][j]=0;
    cout<<t;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            if(a[i][j]<t) aux[i][j]=-1;
    cout<<"\n";
    for(int i=1;i<=r;i++)
    {
        cout<<"\n";
        for(int j=1;j<=c;j++)
            cout<<aux[i][j]<<" ";
    }

    int dr=1;
    if(aux[px][py]!=-1)
    {
        aux[px][py]=1;
        for(int i=1;i<=dr;i++)
        {
            if(aux[c2[0][i]+1][c2[1][i]]== 0)
            {
                aux[c2[0][i]+1][c2[1][i]]=1;
                c2[0][++dr]=c2[0][i]+1;
                c2[1][dr]= c2[1][i];
            }
            if(a[c2[0][i]-1][c2[1][i]]==0)
            {
                a[c2[0][i]-1][c2[1][i]]=1;
                c2[0][++dr]=c2[0][i]-1;
                c2[1][dr]= c2[1][i];
            }
            if(a[c2[0][i]][c2[1][i]+1]==0)
            {
                a[c2[0][i]][c2[1][i]+1]=1;
                c2[0][++dr]=c2[0][i];
                c2[1][dr]= c2[1][i]+1;
            }
            if(a[c2[0][i]][c2[1][i]-1]==0)
            {
                a[c2[0][i]][c2[1][i]-1]=1;
                c2[0][++dr]=c2[0][i];
                c2[1][dr]= c2[1][i]-1;
            }
        }
    }
    if(aux[px][py] == 1) return 1;
    return 0;
}
int caut(int st,int dr)
{
    int r2=dr+1;
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(bun(m))
        {
            if(m<r2) r2=m;
            st=m+1;
        }
        else
        dr=m-1;
    }
    return r2;
}
int main()
{
    //citire
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin>>r>>c;
    fin.get();
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            char x;
            fin.get(x);
            if(x=='.') a[i][j]=MAX;
            else if(x=='*') a[i][j]=-2;
            else if(x=='D')
            {
                a[i][j]=-1;
                xd[poz]=i;
                yd[poz++]=j;
            }
            else if(x=='I') {px=i;py=j;a[i][j]=MAX;}
            else {fx=i;fy=j;a[i][j]=MAX;}
        }
        fin.get();
    }
    poz--;

    for(int i=1;i<=poz;i++)
        marcare(i);

    /*for(int i=1;i<=r;i++)
    {
        fout<<"\n";
        for(int j=1;j<=c;j++)
            fout<<a[i][j]<<" ";
    }*/
    int ma=max(r,c);
    fout<<caut(1,ma);
    return 0;
}