Pagini recente » Cod sursa (job #1066370) | Cod sursa (job #2558301) | Cod sursa (job #2351827) | Cod sursa (job #2598101) | Cod sursa (job #2925753)
#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;
}