Cod sursa(job #2361860)

Utilizator canmihaiCancescu Mihai canmihai Data 2 martie 2019 19:38:50
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,a[1010][1010]={1000},istart,jstart,ifinal,jfinal,f[1010][1010],maxim,dragoni,nrd;
char x;
vector <pair<int,int>> v;
struct nod{
    int x;
    int y;
    int d;
};
int di[4] = {0, 0, 1, -1};
int dj[4] = {1, -1, 0 ,0};
queue <nod> coada;
bool lee(int lim){
    queue <nod> coada2;
    memset(f,0,sizeof f);
    f[istart][jstart]=1;
    coada2.push({istart,jstart,0});
    while(!coada2.empty()){
        nod curent=coada2.front();
        coada2.pop();
        int i=curent.x,j=curent.y;
        if(i==ifinal&&j==jfinal){
            return true;
        }
        for(int t=0;t<4;t++){
             int i2=i+di[t];
             int j2=j+dj[t];
             if(i2>0&&i2<=n&&j2>0&&j2<=m&&a[i2][j2]!=-1&&f[i2][j2]==0&&a[i2][j2]!=-2&&a[i2][j2]>=lim){
                f[i2][j2]=1;
                coada2.push({i2,j2,0});
            }

        }
    }
    return 0;
}
void leeDragoni(){
    memset(f,0,sizeof f);
    //f[si][sj]=1;
    //coada.push({si,sj,0});

    while(!coada.empty()){
        nod curent=coada.front();
        coada.pop();
        int i=curent.x, j=curent.y, dist=curent.d;
        f[i][j]=1;
        if(a[i][j]==0)
            a[i][j]=dist;
        else
            a[i][j]=min(dist,a[i][j]);
     //   if(dragoni==nrd)
      //      maxim=max(a[i][j],maxim);
        for(int t=0;t<4;t++){
            int i2=i+di[t];
            int j2=j+dj[t];
            if(i2>0&&i2<=n&&j2>0&&j2<=m&&a[i2][j2]!=-1&&f[i2][j2]==0&&a[i2][j2]!=-2){
                f[i2][j2]=1;
                coada.push({i2,j2,dist+1});
            }
        }
    }


}
int main(){
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            fin>>x;
            if(x=='D'){
                a[i][j]=-2;
                nrd++;
                v.push_back(make_pair(i,j));
                coada.push({i,j,0});
                }
            if(x=='.')
                a[i][j]=0;
            if(x=='*')
                a[i][j]=-1;
            if(x=='I'){
                a[i][j]=0;
                istart=i;
                jstart=j;
            }
            if(x=='O'){
                a[i][j]=0;
                ifinal=i;
                jfinal=j;
            }
        }


  // for(int i=0;i<v.size();i++){
    //    dragoni++;
        leeDragoni();
   // }
   /* for(int i=1;i<=n;i++){
       for(int j=1;j<=m;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }*/
    int st=1,dr=n*m+1;
   while(st<=dr){
        int mid=(st+dr)/2;
        if(lee(mid)){
            st=mid+1;
          //  cout<<mid<<" "<<dr<<" "<<st<<endl;
        }
        else
            dr=mid-1;
    }
   // cout<<lee(2);
    fout<<dr;
    return 0;
}