Pagini recente » Cod sursa (job #489286) | Cod sursa (job #2181226) | Cod sursa (job #1665407) | Cod sursa (job #375131) | Cod sursa (job #798533)
Cod sursa(job #798533)
#include<fstream>
#include<iostream>
#include<queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct point{
int lin,col;
};
queue <point> q;
point start,end;
int n,m;
char v[1005][1005];
int rez[1005][1005];
bool vizitat[1005][1005];
int dlin[]={ 1, 0, 0, -1};
int dcol[]={ 0, 1, -1, 0};
void clear(bool v[1005][1005])
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
v[i][j]=false;
}
bool lee2(int limita)
{
if(rez[start.lin][start.col]<limita)
return false;
point x,y;
q.push(start);
clear(vizitat);
vizitat[start.lin][start.col]=true;
while(!q.empty())
{
x=q.front();
q.pop();
for(int i=0;i<4;i++)
{
y.lin = x.lin + dlin[i];
y.col = x.col + dcol[i];
if(rez[y.lin][y.col]!=-1&&rez[y.lin][y.col]>=limita&&vizitat[y.lin][y.col]==false)
{
vizitat[y.lin][y.col]=true;
q.push(y);
}
}
}
return vizitat[end.lin][end.col];
}
int cautbin()
{
int pas=1<<12,i;
for(i=0;pas>0;pas>>=1)
{
if(lee2(i+pas))
i+=pas;
}
return i;
}
void lee()
{
point x,y;
while(!q.empty())
{
x=q.front();
q.pop();
for(int i=0;i<4;i++)
{
y.lin = x.lin + dlin[i];
y.col = x.col + dcol[i];
if(rez[y.lin][y.col]==0)
{
rez[y.lin][y.col] = rez[x.lin][x.col] + 1;
q.push(y);
}
}
}
}
int main()
{
int i,j;
point x;
in>>n>>m;
for(i=1;i<=n;i++)
{
in.getline(v[i]+1,m+2);
for(j=1;j<=m;j++)
{
if(v[i][j]=='I')
{
start.lin=i;
start.col=j;
}
if(v[i][j]=='D')
{
x.lin=i;
x.col=j;
q.push(x);
}
if(v[i][j]=='O')
{
end.lin=i;
end.col=j;
}
if(v[i][j]=='*')
{
rez[i][j]==-1;
}
}
}
for(i=0;i<=n+1;i++)
{
v[i][0]=v[i][m+1]='*';
rez[i][0]=rez[i][m+1]=-1;
}
for(j=0;j<=m+1;j++)
{
rez[0][j]=rez[n+1][j]=-1;
v[0][j]=v[n+1][j]='*';
}
lee();
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
out<<rez[i][j]<<"\t";
out<<"\n";
}*/
int rezultat=cautbin();
if(rezultat==0)
out<<"-1";
else out<<rezultat;
return 0;
}