Pagini recente » Cod sursa (job #3196909) | Cod sursa (job #1371993) | Cod sursa (job #1116709) | Cod sursa (job #2605885) | Cod sursa (job #2760823)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in ("barbar.in");
ofstream out ("barbar.out");
int n,m;
int v[1022][1022],mat[1022][1022],vizitat[1020][1020];
int stlin,stc,finlin,finc;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
queue<pair<int,int>> q;
bool verif(int i,int j)
{
if(i<1 || j<1 || i>n || j>m)
return false;
if(v[i][j]==-1)
return false;
return true;
}
void lee()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(v[i][j]==0)
v[i][j]=1e7;
}
}
while(!q.empty())
{
int lin=q.front().first;
int col=q.front().second;
q.pop();
for(int i=0;i<4;i++)
{
int newlin=lin+dx[i];
int newcol=col+dy[i];
if(verif(newlin,newcol) && v[lin][col]+1<v[newlin][newcol])
{
v[newlin][newcol]=v[lin][col]+1;
q.push(make_pair(newlin,newcol));
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(v[i][j]==1e7)
v[i][j]=-1;
else if(v[i][j]>0)
v[i][j]--;
}
}
}
int solve(int nr)
{
if(v[stlin][stc]<nr)
return 1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
mat[i][j]=1e7;
vizitat[i][j]=0;
}
}
mat[stlin][stc]=0;
vizitat[stlin][stc]=1;
q.push(make_pair(stlin,stc));
while(!q.empty())
{
int l=q.front().first;
int c=q.front().second;
q.pop();
for(int i=0;i<4;i++)
{
int lnou=l+dx[i];
int cnou=c+dy[i];
if(verif(lnou,cnou) && v[lnou][cnou]>=nr && vizitat[lnou][cnou]==0)
{
vizitat[lnou][cnou]=1;
mat[lnou][cnou]=mat[l][c];
q.push(make_pair(lnou,cnou));
}
}
}
if(mat[finlin][finc]==0)
return 0;
return 1;
}
int main()
{
in>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char car;
in>>car;
if(car=='D')
{
q.push(make_pair(i,j));
v[i][j]=1;
}
if(car=='I')
{
stlin=i;
stc=j;
}
if(car=='O')
{
finlin=i;
finc=j;
}
if(car=='*')
{
v[i][j]=-1;
}
}
}
lee();
int st=1,dr=n*m;
int rez=0;
while(st<=dr)
{
int mijloc=(st+dr)/2;
int sol=-1;
sol=solve(mijloc);
if(sol==0)
{
st=mijloc+1;
rez=mijloc;
}
else
dr=mijloc-1;
}
if(rez)
out<<rez<<'\n';
else
out<<-1<<'\n';
return 0;
}