Cod sursa(job #2004692)

Utilizator gruhtenZinnenberg Gruhten gruhten Data 26 iulie 2017 12:26:14
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.65 kb
#include <bits/stdc++.h>
#define dim 1<<20
//#define dim 99
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,i,j,nr,q,w,step,x,y,X,Y,D[1<<10][1<<10],viz[1<<10][1<<10],l9,c9;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
char M[1<<10][1<<10];
queue <pair <int,int> > Q;
 int sol=-1,st,dr,mij;

bool inside(int x,int y)
{
    return (x and y and x<=n and y<=m);
}
bool check(int dist)
{
    ++nr;
//    g<<'\n'<<"*nr="<<nr<<" dist="<<dist<<" sol="<<sol<<" step="<<step<<'\n';
    if(dist<=min(n,m))
     if(D[x][y]>=dist)
      Q.push(make_pair(x,y));

    while(!Q.empty())
    {
        q=Q.front().first;
        w=Q.front().second;
        Q.pop();
        //g<<"->Start pt q="<<q<<" si w="<<w<<" "<<Q.size()<<'\n';
        if(viz[q][w]==nr) //a mai fost elementul
        {
           //g<<"**Continua pt q="<<q<<" si w="<<w<<" "<<Q.size()<<'\n';
           continue;
        }

        viz[q][w]=nr;
        for(i=0;i<4;++i)
        {
            l9=q+dx[i];
            c9=w+dy[i];
            if(inside(l9,c9))
                if(M[l9][c9]!='*' and D[l9][c9]>=dist)
                {
                    Q.push(make_pair(l9,c9));
                    //g<<"%%Valid  l9="<<l9<<" si c9="<<c9<<" "<<Q.size()<<'\n';
                }

        }

    }
/******************************/
//g<<"viz pentru nr="<<nr<<'\n';
//for(i=1;i<=n;++i)
//{
//     for(j=1;j<=m;++j)
//        g<<viz[i][j]<<" ";
//     g<<'\n';
//}
////g<<'\n';
/******************************/
    //g<<" viz[x][y]="<<viz[x][y]<<" viz[X][Y]="<<viz[X][Y]<<'\n';
    return (viz[X][Y]==nr);
}


int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
           D[i][j]=dim;

    //citire date
    for(i=1;i<=n;++i)
    {
        f>>(M[i]+1);
        for(j=1;j<=m;++j)
        {
            if(M[i][j]=='I') x=i,y=j;
            if(M[i][j]=='O') X=i,Y=j;
            if(M[i][j]=='D')
            {
                Q.push(make_pair(i,j));
                D[i][j]=0;
            }
        }
    }

/******************************/
//for(i=1;i<=n;++i)
//{
//     for(j=1;j<=m;++j)
//        g<<D[i][j]<<" ";
//     g<<'\n';
//}
/******************************/


    ++nr;

//Lee
    while(!Q.empty())
    {
        q=Q.front().first;
        w=Q.front().second;
        Q.pop();
        if(viz[q][w]==nr)
          continue;
        viz[q][w]=nr;
        for(i=0;i<4;++i)
        {
            l9=q+dx[i];
            c9=w+dy[i];
            if(inside(l9,c9))
                if(M[l9][c9]!='*' and D[l9][c9]>D[q][w]+1)
        {
            D[l9][c9]=D[q][w]+1;
            Q.push(make_pair(l9,c9));
        }
        }

    }

/******************************/
//g<<'\n'<<"dupa Lee:"<<'\n';
//for(i=1;i<=n;++i)
//{
//     for(j=1;j<=m;++j)
//        g<<D[i][j]<<" ";
//     g<<'\n';
//}
//g<<'\n';
/******************************/

//g<<'\n'<<"viz pentru nr="<<nr<<'\n';
//for(i=1;i<=n;++i)
//{
//     for(j=1;j<=m;++j)
//        g<<viz[i][j]<<" ";
//     g<<'\n';
//}
//g<<'\n';


/******************************/
//    for(step=1<<7;step;step>>=1)
//        if(sol+step<=min(n,m))
//            if(check(sol+step))
//              sol=sol+step;
  st=1;
  dr=1<<7;
  while(st<=dr)
  {
      mij=(st+dr)/2;
      if(check(mij))
      {
          sol=mij;
          st=mij+1;
      }
      else{ dr=mij-1;}

  }

    g<<sol;

 /******************************/
//g<<'\n'<<"viz final:"<<'\n';
//for(i=1;i<=n;++i)
//{
//     for(j=1;j<=m;++j)
//        g<<viz[i][j]<<" ";
//     g<<'\n';
//}
//g<<'\n';
/******************************/
    return 0;
}