Pagini recente » Cod sursa (job #2079163) | Cod sursa (job #906249) | Cod sursa (job #986618) | Cod sursa (job #2093568) | Cod sursa (job #2082776)
#include <fstream>
#include <queue>
#include <deque>
#include <climits>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int xi,yi,xf,yf;
int r,c;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int a[1005][1005],b[1005][1005];
queue <pair <int,int> > q;
deque <pair <int,int> > dq;
bool OK(int x,int y)
{
if(x<1 || y <1 || x>r || y >c)
return 0;
return 1;
}
void citire(int r,int c)
{
char s;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
fin>>s;
if(s=='.')
a[i][j]=INT_MAX;
else if(s=='*')
a[i][j]=-1;
else if(s=='D')
{
q.push(make_pair(i,j));
}
else if(s=='O')
{
a[i][j]=INT_MAX;
xi=i;
yi=j;
}
else if(s=='I')
{
a[i][j]=INT_MAX;
xf=i;
yf=j;
}
}
}
void bfs()
{
int i,j,inou,jnou;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(int k=0;k<4;k++)
{
inou=dx[k]+i;
jnou=dy[k]+j;
if(OK(inou,jnou) && a[i][j]+1<a[inou][jnou] )
{
a[inou][jnou]=a[i][j]+1;
q.push(make_pair(inou,jnou));
}
}
}
}
void afisare(int r,int c)
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
fout<<a[i][j]<<" ";
fout<<"\n";
}
}
int main()
{
int v,x,y;
fin>>r>>c;
citire(r,c);
/* while(q.empty()==0)
{
for(int i=0;i<4;i++)
{
if((a[q.front().first][q.front().second]<a[q.front().first+dx[i]][q.front().second+dy[i]]||a[q.front().first+dx[i]][q.front().second+dy[i]]==-2))
{
a[q.front().first+dx[i]][q.front().second+dy[i]]=a[q.front().first][q.front().second]+1;
q.push(make_pair(q.front().first+dx[i],q.front().second+dy[i]));
}
}
q.pop();
}*/
// afisare(r,c);
bfs();
// afisare(r,c);
dq.push_back(make_pair(xi,yi));
while(dq.empty()==0)
{
x=dq.front().first;
y=dq.front().second;
dq.pop_front();
for(int i=0;i<4;i++)
{
if(OK(x+dx[i],y+dy[i])&&b[x+dx[i]][y+dy[i]]==0)
{
b[x+dx[i]][y+dy[i]]=1;
if(a[x+dx[i]][y+dy[i]]>=a[x][y])
{
dq.push_front(make_pair(x+dx[i],y+dy[i]));
a[x+dx[i]][y+dy[i]]=a[x][y];
}
else if(a[x+dx[i]][y+dy[i]]!=-1)
{
dq.push_back(make_pair(x+dx[i],y+dy[i]));
}
}
}
}
// a[xi][yi]=-1;
// afisare(r,c);
if(b[xf][yf]==1)
fout<<a[xf][yf];
else
fout<<-1;
return 0;
}