Pagini recente » Cod sursa (job #776008) | Cod sursa (job #2434376) | Cod sursa (job #1117713) | Cod sursa (job #1473871) | Cod sursa (job #1135231)
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct pozitie
{
int lin,col;
};
char s[1002][1002];
int d[1002][1002];
bool fv[1002][1002];
int calc[1002][1002][4];
queue <pozitie> q;
const int dlin[] = {-1, 0, 1, 0};
const int dcol[] = {0, 1, 0, -1};
int lungime(pozitie x, int id)
{
if(calc[x.lin][x.col][id])
return calc[x.lin][x.col][id];
int i,maxim;
pozitie y;
fv[x.lin][x.col] = 1;
maxim = 0;
for(i = 0; i < 4; i++)
{
y.lin = x.lin + dlin[i];
y.col = x.col + dcol[i];
if(s[y.lin][y.col] != NULL && !fv[y.lin][y.col] && s[y.lin][y.col] != 'I')
{
maxim = max(maxim, lungime(y, i));
}
else if(s[y.lin][y.col] == 'I')
{
maxim = d[y.lin][y.col];
break;
}
}
maxim = min(maxim, d[x.lin][x.col]);
calc[x.lin][x.col][id] = maxim;
fv[x.lin][x.col] = 0;
return maxim;
}
int main()
{
int m,n,i,j,i1,j1,i2,j2;
pozitie x,y;
in>>m>>n;
for(i = 1; i <= m; i++)
in>>(1 + s[i]);
for(i = 1; i <= m; i++)
for(j = 1; j <= n; j++)
if(s[i][j] == 'D')
{
d[i][j] = 1;
q.push((pozitie){i, j});
}
else if(s[i][j] == 'I')
{
i1 = i;
j1 = j;
}
else if(s[i][j] == 'O')
{
i2 = i;
j2 = j;
}
while(!q.empty())
{
x = q.front();
q.pop();
for(i = 0; i < 4; i++)
{
y.lin = x.lin + dlin[i];
y.col = x.col + dcol[i];
if(s[y.lin][y.col] != NULL && !d[y.lin][y.col])
{
d[y.lin][y.col] = 1 + d[x.lin][x.col];
q.push(y);
}
}
}
for(i = 1; i <= m; i++)
for(j = 1; j <= n; j++)
{
if(d[i][j] == 1 || s[i][j] == '*')
{
d[i][j] = -1;
fv[i][j] = 1;
}
else
d[i][j]--;
}
for(i = 0; i < 4; i++)
calc[i1][j1][i] = d[i1][j1];
out<<lungime((pozitie){i2, j2},0);
return 0;
}