Pagini recente » Cod sursa (job #2400766) | Cod sursa (job #1241837) | Cod sursa (job #85468) | Cod sursa (job #2002088) | Cod sursa (job #1585989)
#include <iostream>
#include <fstream>
#define NMAX 1002
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
char mp[NMAX][NMAX];
bool filler[NMAX][NMAX];
void fill(int lin, int col,int mval)
{
filler[lin][col]=1;
if(!filler[lin+1][col]&&mp[lin+1][col]>=mval)
fill(lin+1, col, mval);
if(!filler[lin-1][col]&&mp[lin-1][col]>=mval)
fill(lin-1, col, mval);
if(!filler[lin][col+1]&&mp[lin][col+1]>=mval)
fill(lin, col+1, mval);
if(!filler[lin][col-1]&&mp[lin][col-1]>=mval)
fill(lin, col-1, mval);
}
struct element
{
int x, y;
};
int n, m, nd, bl, bc, il, ic, p, u;
element dragon[NMAX*NMAX];
element que[NMAX*NMAX];
int dx[]= {-1, 0, 1, 0};
int dy[]= {0, 1, 0, -1};
bool mrg(int a)
{
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
filler[i][j]=0;
fill(bl, bc, a);
return filler[il][ic];
}
void border()
{
for(int i=0; i<=n+1; i++)
{
mp[i][0]=-1, mp[i][m+1]=-1;
}
for(int i=0; i<=m+1; i++)
{
mp[0][i]=-1, mp[n+1][i]=-1;
}
}
int main()
{
in>>n>>m;
p=0;
u=-1;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
in>>mp[i][j];
if(mp[i][j]=='I')
bl=i, bc=j, mp[i][j]=0;
else if(mp[i][j]=='D')
dragon[nd].x=i, dragon[nd].y=j, nd++, mp[i][j]=1;
else if(mp[i][j]=='*')
mp[i][j]=-1;
else if(mp[i][j]=='O')
il=i, ic=j, mp[i][j]=0;
else
mp[i][j]=0;
}
}
for(int i=0; i<nd; i++)
{
u++;
que[u]=dragon[i];
}
border();
while(p<=u)
{
int x=que[p].x;
int y=que[p].y;
p++;
for(int i=0; i<4; i++)
{
if(mp[x+dx[i]][y+dy[i]]==0)
{
mp[x+dx[i]][y+dy[i]]=mp[x][y]+1;
u++;
que[u]=(element)
{
x+dx[i], y+dy[i]
};
}
}
}
int pas=1<<10, cp=0;
while(pas)
{
if(mrg(cp+pas))
cp+=pas;
pas>>=1;
}
out<<cp-1;
return 0;
}