Pagini recente » Cod sursa (job #800939) | Cod sursa (job #1332690) | Cod sursa (job #3154271) | Cod sursa (job #1907019) | Cod sursa (job #2059656)
#include <iostream>
#include <cmath>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int m,n;
int XD[1002][1002];
bool visited[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,j;
q[++u]=start;
for(i=1;i<=n;i++)
for(j=0;j<m;j++)
visited[i][j]=0;
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&&!visited[vecin.l][vecin.c])
{
visited[vecin.l][vecin.c]=1;
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;
char c;
in>>n>>m;
for(i=0;i<=n+1;i++)
{
XD[i][0]=-1;
XD[i][m+1]=-1;
}
for(i=0;i<=m+1;i++)
{
XD[0][i]=-1;
XD[n+1][i]=-1;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
in>>c;
if(c=='I')
{
XD[i][j]=10000000;
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]=10000000;
fin.l=i;
fin.c=j;
}
else if(c=='.')
XD[i][j]=10000000;
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(j=0;j<4;j++)
{
vecin.l=curent.l+dl[j];
vecin.c=curent.c+dc[j];
if(XD[vecin.l][vecin.c]>XD[curent.l][curent.c]+1)
{
q[++u]=vecin;
XD[vecin.l][vecin.c]=XD[curent.l][curent.c]+1;
}
}
}
}
out<<cautare();
return 0;
}