Cod sursa(job #2591035)

Utilizator amalia.gemanGeman Aamalia amalia.geman Data 29 martie 2020 15:51:50
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.43 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, mat[1001][1001], a[1001][1001];
int li, ci, lf, cf;
int ul, pr=1;
int dl[]={-1,0,1,0};
int dc[]={0,1,0,-1};

struct celula
{
   int x, y;
}v[1000001];

void Read()
{
    char c;
    fin >> n >> m;
    fin.get();
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            fin >> c;
            if(c == '.') mat[i][j]=0;
            else
                if(c == '*') mat[i][j] = -1;
            else
                if(c == 'D')
            {
                 mat[i][j] = -2;
                 v[++ul].x=i;
                 v[ul].y=j;
            }
            else if(c=='I') mat[i][j] = -3, li=i, ci=j;
            else mat[i][j] = -4, lf=i, cf=j;
        }
       fin.get();
    }
}

void Lee()
{
    int l, c, lv, cv;
    while(pr<=ul)
    {
        l = v[pr].x;
        c = v[pr].y;
        pr++;
        for(int i=0; i<4; i++)
        {
            lv = l + dl[i];
            cv = c + dc[i];
            if(lv>=1 && lv<=n && cv>=1 && cv<=m)
                if(mat[lv][cv]==0)
                {
                    if(mat[l][c] == -2)
                        mat[lv][cv] = 1;
                    else mat[lv][cv] = mat[l][c] + 1;
                    ul++;
                    v[ul].x = lv;
                    v[ul].y = cv;
                }
        }
    }
}

void Reinitializare()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) a[i][j] = 0;
}

int Traseu(int x)
{
    int lv, cv, l, c;
    pr=ul=1;
    v[1].x = li;
    v[1].y = ci;
    while(pr<=ul)
    {
        l = v[pr].x;
        c = v[pr].y;
        pr++;
        for(int i=0; i<4; i++)
        {
            lv = l + dl[i];
            cv = c + dc[i];
            if(lv>=1 && lv<=n && cv>=1 && cv<=m)
               if((mat[lv][cv]>=x||mat[lv][cv]==-4)&&(mat[lv][cv]>0||mat[lv][cv]==-4)&&a[lv][cv]==0)
               { if(mat[lv][cv]==-4) return 1;
                 else {a[lv][cv]=1;ul++;v[ul].x = lv;v[ul].y = cv;}
               }
        }
    }
    Reinitializare();
    return 0;
}

int CB()
{
    int st, dr, mij, sol=-1;
    st = 1;
    dr = 3000;
    while(st<=dr)
    {
        mij = (st+dr)/2;
        if(Traseu(mij))
        {
            sol = mij;
            st = mij+1;
        }
        else dr = mij-1;
    }
    return sol;
}

int main()
{
    Read();
    Lee();
    fout << CB();



    return 0;
}

/*
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char c;
int xs,ys,xf,yf,n,m,a[1002][1002],b[1002][1002],cx[1000001],cy[1000001];
int pr,ul,s,d,mij;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void LEE()
{ pr=1;int i,xc,yc,xv,yv;
    while(pr<=ul)
      { xc=cx[pr];
        yc=cy[pr];
         for(i=0;i<=3;i++)
          {xv=xc+dx[i];
           yv=yc+dy[i];
           if(xv>=1&&xv<=n&&yv>=1&&yv<=m)
             if(a[xv][yv]==0)
               { if(a[xc][yc]==-2) {a[xv][yv]=1;ul++;cx[ul]=xv;cy[ul]=yv;}
                 else {a[xv][yv]=a[xc][yc]+1;ul++;cx[ul]=xv;cy[ul]=yv;}
               }
          }
          pr++;
      }
}
int viz[1001][1001];
int le(int val)
{   pr=ul=1;int j,i,xc,yc,xv,yv;
   for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
     viz[i][j]=0;
    cx[pr]=xs;
    cy[pr]=ys;
    viz[xs][ys]=1;
    while(pr<=ul)
      { xc=cx[pr];
        yc=cy[pr];
         for(i=0;i<=3;i++)
          {xv=xc+dx[i];
           yv=yc+dy[i];
           if(xv>=1&&xv<=n&&yv>=1&&yv<=m)
             if((a[xv][yv]>=val||a[xv][yv]==-4)&&(a[xv][yv]>0||a[xv][yv]==-4)&&viz[xv][yv]==0)
               { if(a[xv][yv]==-4) return 1;
                 else {viz[xv][yv]=1;ul++;cx[ul]=xv;cy[ul]=yv;}
               }
          }
          pr++;
      }
     return 0;
}
int main()
{ fin>>n>>m;fin.get();
   int i,j;
   for(i=1;i<=n;i++)
     { for(j=1;j<=m;j++)
        { fin>>c;
           if(c=='.') a[i][j]=0;
           else if(c=='*') a[i][j]=-1;
           else if(c=='D') {a[i][j]=-2;ul++;cx[ul]=i;cy[ul]=j;}
           else if(c=='I') {a[i][j]=-3;xs=i;ys=j;}
           else if(c=='O') {a[i][j]=-4;xf=i;yf=j;}
        }
    fin.get();
     }
   LEE();

   s=1;d=n+m;
   while(s<=d)
    { mij=s+(d-s)/2;
      if(le(mij)==1) s=mij+1;
      else d=mij-1;
    }
 if((s-1)!=0) fout<<s-1;
 else fout<<-1;
    return 0;
}
*/