Cod sursa(job #797125)
#include<fstream>
#include<queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct poz{
int i , j ;
};
queue <poz> coada;
poz pInceput,pFinal;
char sir[1002][1002];
int diri[]={-1,0,1,0};
int dirj[]={0,1,0,-1};
int lee[1002][1002];
int lee2[1002][1002];
int i , n , m;
poz makePoz(int i , int j)
{
poz a;
a.i=i;
a.j=j;
return a;
}
void afis()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
out<<lee2[i][j]<<"\t";
out<<"\n";
}
out<<"\n";
}
void lee1()
{
while(!coada.empty())
{
poz cur=coada.front();
coada.pop();
for(int i=0;i<4;i++)
if(lee[cur.i+diri[i]][cur.j+dirj[i]]==0)
{
coada.push(makePoz(cur.i+diri[i],cur.j+dirj[i]));
lee[cur.i+diri[i]][cur.j+dirj[i]]=lee[cur.i][cur.j]+1;
}
}
}
void clearLee()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
lee2[i][j]=0;
}
void bordare()
{
for(int i=0;i<=m+1;i++)
{
lee[0][i]=-1;
lee[n+1][i]=-1;
lee2[0][i]=-1;
lee2[n+1][i]=-1;
}
for(int i=0;i<=n+1;i++)
{
lee[i][0]=-1;
lee[i][m+1]=-1;
lee2[i][0]=-1;
lee2[i][m+1]=-1;
}
}
bool verif (int pas)
{
clearLee();
coada.push(pInceput);
lee2[pInceput.i][pInceput.j]=1;
while(!coada.empty())
{
poz cur=coada.front();
coada.pop();
for(int i=0;i<4;i++)
if(lee[cur.i+diri[i]][cur.j+dirj[i]]>=pas+1 && lee2[cur.i+diri[i]][cur.j+dirj[i]]==0)
{
coada.push(makePoz(cur.i+diri[i],cur.j+dirj[i]));
lee2[cur.i+diri[i]][cur.j+dirj[i]]=1;
}
}
// afis();
if(lee2[pFinal.i][pFinal.j]==1)
return true;
return false;
}
void solve(){
int i;
int pas=1<<12;
for(i=0;pas;pas>>=1)
{
if(verif(i+pas)==true)
i+=pas;
}
if(i!=0)
out<<i;
else
out<<"-1";
}
int main()
{
in>>n>>m;
bordare();
in.getline(sir[i],m+2);
for(int i=1;i<=n;i++)
{
in.getline(sir[i],m+2);
for(int j=0;j<m;j++)
{
if(sir[i][j]=='I')
{
pInceput.i=i;
pInceput.j=j+1;
continue;
}
if(sir[i][j]=='O')
{
pFinal.i=i;
pFinal.j=j+1;
continue;
}
if(sir[i][j]=='*')
{
lee[i][j+1]=-1;
continue;
}
if(sir[i][j]=='D')
{
coada.push(makePoz(i,j+1));
lee[i][j+1]=1;
}
}
}
lee1();
solve();
return 0;
}