Pagini recente » Florian Marcu | Cod sursa (job #2488676) | Cod sursa (job #1241818) | Cod sursa (job #1534045) | Cod sursa (job #2059637)
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int m,n;
int XD[1002][1002];
const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
struct comp{
short int l,c;
};
comp q[1000000];
comp dragoni[200000];
comp start;
comp vecin;
comp curent;
comp fin;
bool drum(int dist)
{
int p=0,u=-1,i;
q[++u]=start;
while(p<=u)
{
curent=q[p++];
for(i=0;i<4;i++)
{
vecin.l=curent.l+dl[i];
vecin.c=curent.c+dc[i];
if(XD[vecin.l][vecin.c]<=dist)
{
q[++u]=vecin;
if(vecin.l==fin.l&&vecin.c==fin.c)
return 1;
}
}
}
return 0;
}
int cautare()
{
int pas=1<<12,r=0,x=min(XD[start.l][start.c],XD[fin.l][fin.c]);
while(pas)
{
if(r+pas<=x&&drum(r+pas))
r+=pas;
pas/=2;
}
return r;
}
int main()
{
int i,j,k=0,p,u,dist;
char c;
in>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
in>>c;
if(c=='I')
{
XD[i][j]=1001;
start.l=i;
start.c=j;
}
else if(c=='D')
{
dragoni[k].l=i;
dragoni[k++].c=j;
}
else if(c=='O')
{
XD[i][j]=1001;
fin.l=i;
fin.c=j;
}
else if(c=='.')
XD[i][j]=1001;
else
XD[i][j]=-1;
}
for(i=0;i<k;i++)
{
p=0;u=-1;
q[++u]=dragoni[i];
while(p<=u)
{
curent=q[p++];
for(i=0;i<4;i++)
{
vecin.l=curent.l+dl[i];
vecin.c=curent.c+dc[i];
dist=max(abs(vecin.l-dragoni[i].l),abs(vecin.c-dragoni[i].c));
if(XD[vecin.l][vecin.c]>dist)
{
q[++u]=vecin;
XD[vecin.l][vecin.c]=dist;
}
}
}
}
out<<cautare();
return 0;
}