Cod sursa(job #1071072)

Utilizator RamaStanciu Mara Rama Data 2 ianuarie 2014 15:36:06
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
#include <iostream>
#define NMax 1001

using namespace std;

ifstream in("barbar.in");
ofstream out("barbar.out");

int D[1001][1001], A[1001][1001], X[1000001], Y[1000001];

int N, M, xP, yP, xout, yout, w, x, y, maxD = -1,maxx;
char celula;

int coordx[]={ 0, 1, 0, -1};
int coordy[]={ 1, 0, -1, 0};

void read()
{
    in>>N>>M;
    int i,j;
    for (i=1;i<=N;i++)
        for (j=1;j<=M;j++)
        {
            in>>celula;

            D[i][j]=NMax;

            if(celula=='*') D[i][j] = 0;
            else if(celula=='D')
                {
                    D[i][j]=0;
                    ++w;
                    X[w]=i;
                    Y[w]=j;
                }
                else if(celula=='I')
                    {
                        xP = i;
                        yP = j;
                    }
                    else if(celula=='O')
                        {
                            xout=i;
                            yout=j;
                        }
        }
}

void moves()
{
    int i,j;
     for (j=1;j<=w;j++)
        for (i=0,x=X[j],y=Y[j];i<4;i++)
            if (D[x + coordx[i]][y + coordy[i]] > D[x][y]+1 && x+coordx[i] >= 1 && x+coordx[i] <= N && y+coordy[i] >= 1 && y+coordy[i] <= M)
            {
                D[x + coordx[i]][y + coordy[i]] = D[x][y] + 1;
                w++;
                X[w] = x + coordx[i];
                Y[w] = y + coordy[i];
            }
}

int check(int mid)
{
    if (D[xP][yP]<mid || D[xout][yout]<mid) return 0;
    int j;
    for (j=w=0,X[j]=xP,Y[j]=yP;j<=w && A[xout][yout]!=mid;j++)
    {
        x=X[j];
        y=Y[j];
        int i;
        for (i=0;i<4;++i)
            if ((x+coordx[i]>=1) && (x+coordx[i]<=N) && (y+coordy[i]>=1) && (y+coordy[i]<=M) && (A[x+coordx[i]][y+coordy[i]]!=mid) && (D[x+coordx[i]][y+coordy[i]] >= mid))
            {
                w++;
                X[w]=x+coordx[i];
                Y[w]=y+coordy[i];
                A[x+coordx[i]][y+coordy[i]]=mid;
            }
    }
    if (A[xout][yout]==mid) return 1;

    return 0;
}

void binary(int st, int dr)
{
    int mid=(st+dr)/2;

    if(st>dr) return;
        else
            {
                if(!check(mid))
                binary(st,mid-1);
                    else
                            {
                                maxD=mid;
                                binary(mid+1,dr);
                            }
            }
}
int main()
{
    read();
    moves();
    int max=maxx;
    if(N>maxx) max=N;
    binary(1,max);
    out<<maxD;

    return 0;
}