Pagini recente » Cod sursa (job #1944733) | Cod sursa (job #1847426) | Cod sursa (job #1611353) | Cod sursa (job #2089596) | Cod sursa (job #1001720)
#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;
}
};
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.front();
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 bool Valid(int d)
{
if(b[Lintrare][Cintrare]<=d)
return false;
memset(v,'0',sizeof(v));
v[Lintrare][Cintrare]='1';
while(!q.empty())
q.pop();
Coord aux,w;
int t;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
w.x=Lintrare;w.y=Cintrare;
q.push(w);
while(!q.empty())
{
w=q.front();
q.pop();
for(t=0;t<4;t++)
{
aux.x=w.x+dx[t];
aux.y=w.y+dy[t];
if(a[aux.x][aux.y]!='*' && b[aux.x][aux.y]>d && v[aux.x][aux.y]!='1')
{
if(aux.x==Liesire && aux.y==Ciesire)
return true;
v[aux.x][aux.y]='1';
q.push(aux);
}
}
}
return false;
}
int main()
{
int i,j,sol=-1,st,dr,d;
Read();
Lee();
ofstream fout("barbar.out");
st=0;dr=1000;
while(st<=dr)
{
d=(st+dr)>>1;
if(Valid(d))
{
sol=d;
st=d+1;
}
else
dr=d-1;
}
fout<<sol<<"\n";
fout.close();
return 0;
}