Cod sursa(job #2737014)

Utilizator alex1033Alex Putineanu alex1033 Data 4 aprilie 2021 12:22:50
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("barbar.in");
ofstream out("barbar.out");

const int nmax=1006;
char a[nmax][nmax];
int n,m,vc[nmax][nmax];
bool mat[nmax][nmax];
queue<pair<int,int>>q;

struct p{
int x,y;
}O,I;

int di[]={1,0,-1,0};
int dj[]={0,-1,0,1};


void read() {
  in >> n >> m;
  for (int i = 1; i <= n; i++)
    in>>(a[i]+1);

}

bool valid(int i, int j) {
  if (i >= 1 && i <= n && j >= 1 && j <= m)
    return 1;
  return 0;
}

void dragoni() {
  int c1 = 0, c2 = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      if (a[i][j] == 'D') {
        vc[i][j] = 1;
        q.push(make_pair(i, j));
      }
      else if (a[i][j] == 'O') O = {i,j};
      else if (a[i][j] == 'I') I = {i,j};
    }

}

void lee() {
  while (!q.empty()) {
    int i = q.front().first;
    int j = q.front().second;
    for (int k = 0; k < 4; k++) {
      int iv = i + di[k];
      int jv = j + dj[k];
      if (valid(iv, jv) && a[iv][jv] != '*' && !vc[iv][jv]) {
        vc[iv][jv] = vc[i][j] + 1;
        q.push(make_pair(iv, jv));
      }
    }
    q.pop();
  }
}


int maxi(){
int val=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
val=max(val,vc[i][j]);

return val;
}

bool parc(int v){
if(vc[I.x][I.y]<=v)
return false;

memset(mat,0,sizeof(mat));

queue<pair<int,int>>q1;

q1.push(make_pair(I.x,I.y));
mat[I.x][I.y]=1;

while(!q1.empty()){
int i=q1.front().first;
int j=q1.front().second;
q1.pop();

if(i==O.x&&j==O.y) return true;

for(int k=0;k<4;k++)
{
 int iv=i+di[k];
 int jv=j+dj[k];
 if(valid(iv,jv)&&a[iv][jv]!='*'&&!mat[iv][jv]&&vc[iv][jv]>v){
    mat[iv][jv]=1;
    q1.push(make_pair(iv,jv));
  }
 }
}

return false;
}

void solve(){
 int st=1,dr=maxi(),sol=-1;
 while(st<=dr){
   int mij=(st+dr)/2;

   if(parc(mij)){
    sol=mij;
    st=mij+1;

   }
   else dr=mij-1;

 }
  out<<sol;
}



int main() {
  read();
  dragoni();
  lee();
  solve();

  return 0;
}