Cod sursa(job #1598868)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 13 februarie 2016 13:48:55
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <fstream>
#include <deque>
using namespace std;
ifstream fi ("barbar.in");
ofstream fo ("barbar.out");
deque<int> lee1,lee2,lee1f,lee2f;
deque<int>::iterator it;
char cr;
int a[1005][1005],b[1005][1005],f[2005],target,mini,sol,lin,col,i,li,lf,ci,cf,nl,nc,l,c,k,kreal,x,maxi;
int main()
{
    fi>>nl>>nc;
    for (l=1;l<=nl;l++)
    for (c=1;c<=nc;c++)
    {
      fi>>cr;
      if (cr=='D') {lee1.push_back(l);lee2.push_back(c);k++;a[l][c]=-2;}
      if (cr=='*') a[l][c]=-1;
      if (cr=='I') {li=l;ci=c;}
      if (cr=='O') {lf=l;cf=c;}
    }
    while (!lee1.empty())
    {
      x++;
      kreal=k;
      for (i=1;i<=kreal;i++)
      {
        k--;
        lin=lee1.back();lee1.pop_back();
        col=lee2.back();lee2.pop_back();
        if (lin<=nl and lin>0 and col<=nc and col>0)
        {if (a[lin-1][col]==0) {a[lin-1][col]=x;k++;lee1.push_front(lin-1);lee2.push_front(col);}
        if (a[lin][col+1]==0) {a[lin][col+1]=x;k++;lee1.push_front(lin);lee2.push_front(col+1);}
        if (a[lin+1][col]==0) {a[lin+1][col]=x;k++;lee1.push_front(lin+1);lee2.push_front(col);}
        if (a[lin][col-1]==0) {a[lin][col-1]=x;k++;lee1.push_front(lin);lee2.push_front(col-1);}}
      }
    }
    for (l=1;l<=nl;l++)
    {
      for (c=1;c<=nc;c++)
        {
//          if (a[l][c]==-2) a[l][c]=0;
//          fo<<a[l][c]<<' ';
          maxi=max(a[l][c],maxi);
        }
//          fo<<'\n';
    }
    mini=-1;
    sol=-1;
    while (1>0)
    {
      for (l=1;l<=nl;l++)
        for (c=1;c<=nc;c++) b[l][c]=a[l][c];
      target=(maxi+mini)/2;
      lee1f.push_back(li);
      lee2f.push_back(ci);
      if (a[li][ci]<target) target=3000;
        while (!lee1f.empty())
        {
          lin=lee1f.back();lee1f.pop_back();
          col=lee2f.back();lee2f.pop_back();
          if (lin<=nl and lin>0 and col<=nc and col>0)
          {if (a[lin-1][col]>=target and b[lin-1][col]!=-1) {lee1f.push_front(lin-1);lee2f.push_front(col);b[lin-1][col]=-1;}
          if (a[lin][col+1]>=target and b[lin][col+1]!=-1) {lee1f.push_front(lin);lee2f.push_front(col+1);b[lin][col+1]=-1;}
          if (a[lin+1][col]>=target and b[lin+1][col]!=-1) {lee1f.push_front(lin+1);lee2f.push_front(col);b[lin+1][col]=-1;}
          if (a[lin][col-1]>=target and b[lin][col-1]!=-1) {lee1f.push_front(lin);lee2f.push_front(col-1);b[lin][col-1]=-1;}}
          if (lin==lf and col==cf) {sol=target;break;}
        }
      while (!lee2f.empty()) {lee2f.pop_back();lee1f.pop_back();}
      if (sol==target) mini=(maxi+mini)/2;
      else maxi=(maxi+mini)/2;
      if (maxi-mini<=1) break;
    }
    fo<<sol;
    return 0;
}