Pagini recente » Cod sursa (job #472170) | Cod sursa (job #1789029) | Cod sursa (job #1620101) | Cod sursa (job #2060060) | Cod sursa (job #2591031)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, mat[1001][1001], a[1001][1001];
int li, ci, lf, cf;
int ul, pr=1;
int dl[]={-1,0,1,0};
int dc[]={0,1,0,-1};
struct celula
{
int x, y;
}v[1000001];
void Read()
{
char c;
fin >> n >> m;
fin.get();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
fin >> c;
if(c == '.') mat[i][j]=0;
else
if(c == '*') mat[i][j] = -1;
else
if(c == 'D')
{
mat[i][j] = -2;
v[++ul].x=i;
v[ul].y=j;
}
else if(c=='I') mat[i][j] = -3, li=i, ci=j;
else mat[i][j] = -4, lf=i, cf=j;
}
fin.get();
}
}
void Lee()
{
int l, c, lv, cv;
while(pr<=ul)
{
l = v[pr].x;
c = v[pr].y;
pr++;
for(int i=0; i<4; i++)
{
lv = l + dl[i];
cv = c + dc[i];
if(lv>=1 && lv<=n && cv>=1 && cv<=m)
if(mat[lv][cv]==0)
{
if(mat[l][c] == -2)
mat[lv][cv] = 1;
else mat[lv][cv] = mat[l][c] + 1;
ul++;
v[ul].x = lv;
v[ul].y = cv;
}
}
}
}
void Reinitializare()
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) a[i][j] = 0;
}
int Traseu(int x)
{
int lv, cv, l, c;
pr=ul=1;
v[1].x = li;
v[1].y = ci;
while(pr<=ul)
{
l = v[pr].x;
c = v[pr].y;
pr++;
for(int i=0; i<4; i++)
{
lv = l + dl[i];
cv = c + dc[i];
if(lv>=1 && lv<=n && cv>=1 && cv<=m)
if(a[lv][cv] == 0)
if(mat[lv][cv] >= x)
{
ul++;
v[ul].x = lv;
v[ul].y = cv;
a[lv][cv]=1;
}
else
if(mat[lv][cv] == -4)
return 1;
}
}
Reinitializare();
return 0;
}
int CB()
{
int st, dr, mij, sol=-1;
st = 1;
dr = 3000;
while(st<=dr)
{
mij = (st+dr)/2;
if(Traseu(mij))
{
sol = mij;
st = mij+1;
}
else dr = mij-1;
}
return sol;
}
int main()
{
Read();
Lee();
fout << CB();
/*
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
fout<<mat[i][j]<<" ";
fout<<"\n";
}
*/
return 0;
}