Pagini recente » Cod sursa (job #2460159) | Cod sursa (job #209752) | Cod sursa (job #401545) | Cod sursa (job #2917681) | Cod sursa (job #3020934)
#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)
{ 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;
}
}
g<<-1;
return 0;
}