Cod sursa(job #2925895)

Utilizator RusuRRusu Rares RusuR Data 16 octombrie 2022 12:55:47
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <utility>
using namespace std;

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

queue<pair<int,int>> q;
queue<pair<int,int>> a;
int r,c,sx,sy,fx,fy,d[1001][1001],n,nr,lnr;
char l;
bool p[1001][1001],ok;
int main()
{ f>>r>>c;
  for(int i=1;i<=r;i++)
     for(int j=1;j<=c;j++)
     { f>>l;
       switch(l){
       case 'I':
	sx=i;
        sy=j;
	break;
       case 'O':
	fx=i;
        fy=j;
	break;
       case 'D':
	q.push(make_pair(i,j));
	d[i][j]=1;
	break;
       case '*':
	d[i][j]=-1;
        break;
       }
     }

  while(!q.empty())
  { int x, y;
    x=q.front().first;
    y=q.front().second;
    if(d[x+1][y]==0&&x<r)d[x+1][y]=d[x][y]+1,q.push(make_pair(x+1,y));
    if(d[x-1][y]==0&&x>1)d[x-1][y]=d[x][y]+1,q.push(make_pair(x-1,y));
    if(d[x][y+1]==0&&y<c)d[x][y+1]=d[x][y]+1,q.push(make_pair(x,y+1));
    if(d[x][y-1]==0&&y>1)d[x][y-1]=d[x][y]+1,q.push(make_pair(x,y-1));
    q.pop();
  }
  n=min(d[sx][sy],d[fx][fy]);
  q.push(make_pair(sx,sy));
  p[sx][sy]=1;
  ok=1;
  nr=1;
  while(n>=2)
  { 
    /*
    for(int i=1;i<=r;i++)
       for(int j=1;j<=c;j++)
       { if(p[i][j]==1)
         { if(d[i+1][j]>=n&&p[i+1][j]==0)p[i+1][j]=1,ok=1;
	   if(d[i][j+1]>=n&&p[i][j+1]==0)p[i][j+1]=1,ok=1;
	   if(d[i-1][j]>=n&&p[i-1][j]==0)p[i-1][j]=1,ok=1;
  	   if(d[i][j-1]>=n&&p[i][j-1]==0)p[i][j-1]=1,ok=1;
         }
       }
    */
    int x=q.front().first;
    int y=q.front().second;
    if(d[x+1][y]>=n&&x<r&&p[x+1][y]==0)q.push(make_pair(x+1,y)),p[x+1][y]=1,nr++;
    else if(d[x+1][y]==n-1&&x<r&&p[x+1][y]==0)a.push(make_pair(x+1,y));

    if(d[x][y+1]>=n&&y<c&&p[x][y+1]==0)q.push(make_pair(x,y+1)),p[x][y+1]=1,nr++;
    else if(d[x][y+1]==n-1&&y<r&&p[x][y+1]==0)a.push(make_pair(x,y+1));

    if(d[x-1][y]>=n&&x>1&&p[x-1][y]==0)q.push(make_pair(x-1,y)),p[x-1][y]=1,nr++;
    else if(d[x-1][y]==n-1&&x>1&&p[x-1][y]==0)a.push(make_pair(x-1,y));

    if(d[x][y-1]>=n&&y>1&&p[x][y-1]==0)q.push(make_pair(x,y-1)),p[x][y-1]=1,nr++;
    else if(d[x][y-1]==n-1&&y>1&&p[x][y-1]==0)a.push(make_pair(x,y-1));
    nr--;
    q.pop();

    if(q.size()==0)
    { n--;
      while(a.size()){
      q.push(a.front());
      p[a.front().first][a.front().second]=1;
      a.pop();
      }
    }
    if(p[fx][fy]==1)
    { g<<n-1;
      return 0;	    
    }
    /*
  cout<<n<<' '<<q.size()<<' '<<a.size()<<'\n';
  for(int i=1;i<=r;i++)
  {   for(int j=1;j<=c;j++)
        cout<<p[i][j]<<' '; 
     cout<<'\n';
  }
  
  cout<<'\n';

  for(int i=1;i<=r;i++)
  {   for(int j=1;j<=c;j++)
        cout<<d[i][j]<<' '; 
     cout<<'\n';
  }*/
  }
  g<<-1;
  return 0;
}