Pagini recente » Cod sursa (job #977618) | Cod sursa (job #2847837) | Cod sursa (job #1521335) | Cod sursa (job #9424) | Cod sursa (job #1001694)
#include <queue>
#include <fstream>
#include <cstring>
using namespace std;
struct Coord {
int x, y, cost;
bool operator < (const Coord& e) const
{
return cost > e.cost;
}
};
priority_queue <Coord> q;
int L,C,Lintrare,Cintrare,Liesire,Ciesire,b[1005][1005];
char a[1005][1005],v[1005][1005];
inline void Bordeaza()
{
int i;
for(i=0;i<=C+1;i++)
a[0][i]=a[L+1][i]='*';
for(i=0;i<=L+1;i++)
a[i][0]=a[i][C+1]='*';
}
inline void Read()
{
int i,j;
Coord aux;
ifstream fin("barbar.in");
fin>>L>>C;
for(i=1;i<=L;i++)
fin>>(a[i]+1);
Bordeaza();
for(i=1;i<=L;i++)
for(j=1;j<=C;j++)
if(a[i][j]=='I')
{
Lintrare=i;Cintrare=j;
}
else
if(a[i][j]=='O')
{
Liesire=i;Ciesire=j;
}
else
if(a[i][j]=='D')
{
aux.x=i;
aux.y=j;
aux.cost=1;
q.push(aux);
b[i][j]=1;
}
fin.close();
}
inline void Lee()
{
Coord w,w2;
int t;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
while(!q.empty())
{
w=q.top();
q.pop();
for(t=0;t<4;t++)
{
w2.x=w.x+dx[t];
w2.y=w.y+dy[t];
w2.cost=w.cost+1;
if(a[w2.x][w2.y]!='*')
if(b[w2.x][w2.y]==0)
{
q.push(w2);
b[w2.x][w2.y]=w2.cost;
}
}
}
}
inline void Fill(int i, int j, int d)
{
if(a[i-1][j]!='*' && b[i-1][j]>d && v[i-1][j]!='1')
{
v[i-1][j]='1';
Fill(i-1,j,d);
}
if(a[i+1][j]!='*' && b[i+1][j]>d && v[i+1][j]!='1')
{
v[i+1][j]='1';
Fill(i+1,j,d);
}
if(a[i][j-1]!='*' && b[i][j-1]>d && v[i][j-1]!='1')
{
v[i][j-1]='1';
Fill(i,j-1,d);
}
if(a[i][j+1]!='*' && b[i][j+1]>d && v[i][j+1]!='1')
{
v[i][j+1]='1';
Fill(i,j+1,d);
}
}
int main()
{
int i,j,sol=-1,st,dr,d;
Read();
Lee();
ofstream fout("barbar.out");
/*for(i=1;i<=L;i++)
{
for(j=1;j<=C;j++)
fout<<b[i][j]<<" ";
fout<<"\n";
}*/
st=2;dr=2000;
while(st<=dr)
{
d=(st+dr)/2;
memset(v,'0',sizeof(v));
v[Lintrare][Cintrare]='1';
Fill(Lintrare,Cintrare,d);
if(v[Liesire][Ciesire]=='1' && b[Lintrare][Cintrare]>=d)
{
sol=d;
st=d+1;
}
else
dr=d-1;
}
fout<<sol<<"\n";
fout.close();
return 0;
}