Cod sursa(job #1668881)

Utilizator Bodo171Bogdan Pop Bodo171 Data 30 martie 2016 09:52:04
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include<fstream>
#include<deque>
using namespace std;
deque<int> l,c;
int li,ci,lf,cf,i,j,n,m,a[1005][1005],b[1005][1005],x1,x2,y1,y2;
char car;
int main()
{
   ifstream f("barbar.in");
   ofstream g("barbar.out");
   int d1[]={-1,0,1,0};
   int d2[]={0,-1,0,1};
   f>>n>>m;
   for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
   {f>>car;
   if(car=='D')
   {
       l.push_back(i);
       c.push_back(j);
   }
   else
   {
       if(car=='*') {a[i][j]=-1;b[i][j]=-1;}
       else if(car=='I') {x1=i;y1=j;}
       else if(car=='O') {x2=i;y2=j;}
   }
   }
    while(!l.empty())
    {
        li=l.front();
        ci=c.front();
        l.pop_front();
        c.pop_front();
        if(li!=0 && ci!=0 && li!=n+1 && ci!=m+1)
        for(i=0;i<4;i++)
        {
          lf=li+d1[i];cf=ci+d2[i];
          if(a[lf][cf]==0)
          {
              a[lf][cf]=a[li][ci]+1;
              l.push_back(lf);
              c.push_back(cf);
          }
        }

    }

    l.push_back(x1);
    c.push_back(y1);
    b[x1][y1]=a[x1][y1];
    while(!l.empty())
    {
        li=l.front();
        ci=c.front();
        l.pop_front();
        c.pop_front();
        if(li!=0 && ci!=0 && li!=n+1 && ci!=m+1)
        for(i=0;i<4;i++)
        {
            lf=li+d1[i];cf=ci+d2[i];
            if(min(b[li][ci],a[lf][cf])>b[lf][cf])
            {
                l.push_back(lf);
                c.push_back(cf);
                b[lf][cf]=min(b[li][ci],a[lf][cf]);

            }
        }
    }
   if(b[x2][y2]!=0 &&b[x2][y2]!=-1) g<<b[x2][y2];
   else g<<-1;
    return 0;
}