Cod sursa(job #1192649)

Utilizator costyrazvyTudor Costin Razvan costyrazvy Data 29 mai 2014 14:40:28
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

#define NMAX 1001

char S[NMAX];
int HM[NMAX][NMAX],M[NMAX][NMAX];
int A,SN,SM,step,sol,i;
vector < pair < int , int > > D;
queue < pair < int , int > > Q,HD;
pair < int , int > Start,Finish;
const int Dx[]={0,0,0,-1,1};
const int Dy[]={0,-1,1,0,0};

int modul (int x)
{
    if (x<0) return -x;
    return x;
}

bool Good(pair < int , int > P)
{
    if (P.first < 1 || P.first > SN || P.second < 1 || P.second > SM) return false;
    if (HM[P.first][P.second]!=0) return false;
    return true;
}

void Read()
{
int i,j;

scanf("%d%d\n",&SN,&SM);
A=max(SN,SM);

for (i=1;i<=SN;++i)
{
    scanf("%s\n",&S);
    for (j=SM;j>=1;j--)
        switch (S[j-1])
        {
           case 'D' : M[i][j]=-1 , D.push_back(make_pair(i,j));
           break;

           case '*' : M[i][j]=-1;
           break;

           case 'I' : Start=make_pair(i,j);
           break;

           case 'O' : Finish=make_pair(i,j);
           break;
       }
}
}

bool Test(int x)
{
    int i,j;
    vector < pair < int , int > > :: iterator it;
    pair < int , int > Help,Now;

    for (i=1;i<=SN;++i)
      for (j=1;j<=SM;++j)
      HM[i][j]=M[i][j];

    for (it=D.begin();it!=D.end();++it) HD.push(*it);

    while (!HD.empty())
    {
        Now=HD.front();
        HD.pop();

        if (modul(HM[Now.first][Now.second])==x) continue;

        for (i=1;i<=4;++i)
        {
            Help=Now;

            Help.first+=Dx[i];
            Help.second+=Dy[i];

            if (!Good(Help)) continue;

            HM[Help.first][Help.second]=HM[Now.first][Now.second]-1;
            HD.push(Help);
        }

    }

    if (HM[Start.first][Start.second]!=0) return false;
    HM[Start.first][Start.second]=1;

    while (!Q.empty()) Q.pop();
    Q.push(Start);

    while (!Q.empty())
    {
        Now=Q.front();
        Q.pop();

        for (i=1;i<=4;++i)
        {
            Help=Now;

            Help.first+=Dx[i];
            Help.second+=Dy[i];

            if (!Good(Help)) continue;

            HM[Help.first][Help.second]=HM[Now.first][Now.second];
            Q.push(Help);
            if (Help==Finish) return true;
        }

    }

    return false;
}

int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);

Read();

for (step=1; (step<<1)<=A; step<<=1);

for (i=0; step; step>>=1)
{
    if (i+step>A) continue;
    if (!Test(i+step)) continue;

    i+=step;
    sol=i;
}

printf("%d\n",sol);

return 0;
}