Cod sursa(job #874559)

Utilizator radu_bucurRadu Bucur radu_bucur Data 8 februarie 2013 20:03:25
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int g[]={0,0,1,-1};
const int h[]={1,-1,0,0};
int n,m,k,l,i,j,x1,x2,y1,y2,a[1002][1002],b[1000002],c[1000002],minim,maxim,z,p;
int d[1002][1002];
char s;
bool verif(int u)
{
    for (i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            d[i][j]=-1;
        }
    d[x1][x2]=1; l=1; k=1; b[1]=x1; c[1]=x2;
    while(l<=k)
    {
       for(i=0;i<4;i++)
       {
           if(d[b[l]+g[i]][c[l]+h[i]]==-1&&a[b[l]+g[i]][c[l]+h[i]]>=u)
           {
               k++;
               d[b[l]+g[i]][c[l]+h[i]]=d[b[l]][c[l]]+1;
               b[k]=b[l]+g[i]; c[k]=c[l]+h[i];
           }
       }
       l++;
    }
    if(d[y1][y2]!=-1) return true;
    return false;
}
void bin(int st, int dr)
{
    if(st>=dr) return;
    int z=(st+dr)/2;
    if(verif(z)==true)
    {
        if(z>maxim) maxim=z;
        bin(z+1,dr);
    }
    else bin(1,z-1);
    return;
}
int main()
{
    in>>n>>m>>ws;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            in>>s;
            if(s=='.') a[i][j]=-1;
            if(s=='D')
            {
                a[i][j]=0;
                k++;
                b[k]=i; c[k]=j;
            }
            if(s=='*') a[i][j]=-2;
            if(s=='I')
            {
                a[i][j]=-1;
                x1=i; x2=j;
            }
            if(s=='O')
            {
                a[i][j]=-1;
                y1=i; y2=j;
            }
            cout<<a[i][j]<<" ";
        }
        cout<<"\n";
    }
    l=1;
    while(l<=k)
    {
        for (i=0;i<4;i++)
        {
            if(a[b[l]+g[i]][c[l]+h[i]]==-1)
            {
                a[b[l]+g[i]][c[l]+h[i]]=a[b[l]][c[l]]+1;
                k++;
                b[k]=b[l]+g[i]; c[k]=c[l]+h[i];
            }
        }
        l++;
    }
    minim=a[x1][x2]; maxim=0;
    if(minim>a[y1][y2]) minim=a[y1][y2];
    bin(1,minim);
    out<<maxim;
    return 0;
}