Pagini recente » Cod sursa (job #1075358) | Cod sursa (job #565495) | Cod sursa (job #1697093) | Cod sursa (job #1326401) | Cod sursa (job #1978296)
#include <bits/stdc++.h>
#define nmax 1001
#define oo 1000000
using namespace std;
char a[nmax][nmax];
int dragoni[nmax][nmax],drum[nmax][nmax],n,m,xi,yi,xf,yf;
queue<pair<int,int> >q;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void Citire()
{
int i,j;
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>(a[i]+1);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='I')
{
xi=i;
yi=j;
}
else if(a[i][j]=='O')
{
xf=i;
yf=j;
}
}
inline bool Verificare(int x,int y)
{
if(1<=x && x<=n && 1<=y && y<=m)
return true;
return false;
}
inline void Initializare()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
dragoni[i][j]=oo;
}
inline void Initializare1()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
drum[i][j]=oo;
}
void Lee()
{
int i,j,x,y,k;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='D')
{
q.push(make_pair(i,j));
dragoni[i][j]=1;
}
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
if(Verificare(x,y) && a[x][y]!='*' && dragoni[x][y]>dragoni[i][j]+1)
{
dragoni[x][y]=dragoni[i][j]+1;
q.push(make_pair(x,y));
}
}
}
/*for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
fout<<dragoni[i][j]<<" ";
fout<<"\n";
}
*/
}
inline bool Lee_Binar(int dist)
{
int i,j,x,y,k;
if(dragoni[xi][yi]<=dist)
return false;
Initializare1();
q.push(make_pair(xi,yi));
drum[xi][yi]=0;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
if(Verificare(x,y) && a[x][y]!='*' && drum[x][y]>drum[i][j]+1 && dragoni[x][y]>dist)
{
drum[x][y]=drum[i][j]+1;
q.push(make_pair(x,y));
}
}
}
if(drum[xf][yf]!=oo)
return true;
return false;
}
inline int Caut_Bin()
{
int st=1,dr=oo,mij,poz=-1;
while(st<=dr)
{
mij=(st+dr)/2;
if(Lee_Binar(mij))
{
poz=mij;
st=mij+1;
}
else dr=mij-1;
}
return poz;
}
int main()
{
Citire();
Initializare();
Lee();
fout<<Caut_Bin()<<"\n";
fin.close();
fout.close();
return 0;
}