Pagini recente » Cod sursa (job #248439) | Cod sursa (job #1852289) | Cod sursa (job #1489140) | Cod sursa (job #237718) | Cod sursa (job #2562476)
#include <bits/stdc++.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N=1001;
int v[N][N];
int L[N][N],C[N][N];
deque <pair<int ,int> > c;
int xi[5]={0,1,0,-1,0};
int yi[5]={0,0,1,0,-1};
int viz[N][N];
int dd(int x,int y)
{
int minn=9999;
for(int i=1;i<=L[x][0];i++)
{
if(fabs(y-L[x][i])<minn)
minn=fabs(y-L[x][i]);
}
for(int i=1;i<=C[y][0];i++)
{
if(fabs(x-C[y][i])<minn)
minn=fabs(x-C[y][i]);
}
return minn;
}
int main()
{
int n,m,x,y,xs,ys;
char a;
in>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
in>>a;
if(a=='D')
{
L[i][0]++;
C[j][0]++;
L[i][L[i][0]]=j;
C[j][C[j][0]]=i;
v[i][j]=-1;
}
else if(a=='I')
{
x=i;
y=j;
}
else if(a=='O')
{
xs=i;
ys=j;
}
else if(a=='*')
{
v[i][j]=-2;
}
}
c.push_back({x,y});
viz[x][y]=1;
v[x][y]=dd(x,y);
while(!c.empty())
{
pair<int ,int> b=c.front();
c.pop_front();
int i=b.first,j=b.second;
for(int k=1;k<=4;k++)
{
int i1=i+xi[k],j1=j+yi[k];
if(i1>=1 && j1>=1 && i1<=n && j1<=n&&v[i1][j1]>=0)
{
int d=dd(i1,j1);
if(viz[i1][j1]==0 || (v[i1][j1]<v[i][j] && d>=v[i][j]))
{
viz[i1][j1]=1;
if(v[i1][j1]<v[i][j] && d>=v[i][j])
{
v[i1][j1]=v[i][j];
c.push_front({i1,j1});
}
else
{
v[i1][j1]=d;
c.push_back({i1,j1});
}
}
}
}
}
if(v[xs][ys]==0)
out<<-1;
else
out<<v[xs][ys];
return 0;
}