Pagini recente » Cod sursa (job #1704178) | Cod sursa (job #2527306) | Cod sursa (job #2663976) | Cod sursa (job #1503229) | Cod sursa (job #2424589)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define nmax 1005
int n,m,v[nmax][nmax],d[nmax][nmax],c=0,stx,sty,stpx,stpy,drum[nmax][nmax],viz[nmax][nmax];
char a;
int dl[4]={-1,0,1,0};
int dc[4]={0,1,0,-1};
queue < pair<int,int> > coada;
int OK(int i, int j)
{
if(i<1 || j<1 || i>n || j>m)
return false;
if(v[i][j]==-1)
return false;
return true;
}
struct Compare
{
bool operator()(pair<int,int> x, pair<int,int> y)
{
return d[x.first][x.second]<d[y.first][y.second];
}
};
priority_queue < pair<int,int>, vector< pair<int,int> >, Compare> Heap;
void Fill()
{
int i,j,i_urm,j_urm;
while(!coada.empty())
{
i=coada.front().first;
j=coada.front().second;
coada.pop();
for(int dir=0;dir<4;dir++)
{
i_urm=i+dl[dir];
j_urm=j+dc[dir];
if(OK(i_urm,j_urm) && !d[i_urm][j_urm])
{
d[i_urm][j_urm]=d[i][j]+1;
coada.push(make_pair(i_urm,j_urm));
}
else
{
if(OK(i_urm,j_urm) && d[i_urm][j_urm])
{
if(d[i][j]+1<d[i_urm][j_urm])
d[i_urm][j_urm]=d[i][j]+1;
}
}
}
}
}
void Lee()
{
int i,j,i_urm,j_urm;
Heap.push(make_pair(stx,sty));
viz[stx][sty]=1;
while(!Heap.empty())
{
i=Heap.top().first;
j=Heap.top().second;
Heap.pop();
for(int dir=0;dir<4;dir++)
{
i_urm=i+dl[dir];
j_urm=j+dc[dir];
if(OK(i_urm,j_urm) && !v[i_urm][j_urm])
{
v[i_urm][j_urm]=v[i][j]+1;
viz[i_urm][j_urm]=1;
if(d[i_urm][j_urm]<drum[i][j])
drum[i_urm][j_urm]=d[i_urm][j_urm];
else
drum[i_urm][j_urm]=drum[i][j];
Heap.push(make_pair(i_urm,j_urm));
}
}
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
fin>>a;
switch(a)
{
case '*':
{
v[i][j]=-1;
d[i][j]=-1;
break;
}
case 'I':
{
v[i][j]=1;
stx=i;
sty=j;
break;
}
case 'O':
{
stpx=i;
stpy=j;
break;
}
case 'D':
{
coada.push(make_pair(i,j));
d[i][j]=1;
break;
}
default:
{
break;
}
}
}
}
Fill();
drum[stx][sty]=d[stx][sty];
Lee();
if(viz[n][m])
fout<<drum[n][m]-1;
else
fout<<-1;
}