Cod sursa(job #2925753)

Utilizator RusuRRusu Rares RusuR Data 15 octombrie 2022 23:46:23
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 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;
int r,c,sx,sy,fx,fy,d[1001][1001],n;
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=d[sx][sy];

  p[sx][sy]=1;
  ok=1;
  while(n>=2)
  { ok=0;
    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;
         }
       }

    if(ok==0)n--;	
 
    if(p[fx][fy]==1)
    { g<<n-1;
      return 0;	    
    }
  }
  g<<-1;
  return 0;
}