Pagini recente » Cod sursa (job #1223759) | Cod sursa (job #2393666) | Cod sursa (job #269656) | Cod sursa (job #1633434) | Cod sursa (job #1132130)
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct pozitie
{
int lin,col;
};
char v[1001][1001];
int d[1001][1001];
int d1[1001][1001];
bool fv[1001][1001];
queue <pozitie> q;
const int dlin[] = {-1,0,1,0};
const int dcol[] = {0,1,0,-1};
int barbar(pozitie x)
{
if(d1[x.lin][x.col])
return d1[x.lin][x.col];
fv[x.lin][x.col] = 1;
int i,rc = 0;
pozitie y;
for(i = 0; i < 4; i++)
{
y.lin = x.lin + dlin[i];
y.col = x.col + dcol[i];
if(!fv[y.lin][y.col] && d[y.lin][y.col] != -1)
rc = max(rc, barbar(y));
}
rc = min(rc, d[x.lin][x.col]);
d1[x.lin][x.col] = rc;
fv[x.lin][x.col] = 0;
return rc;
}
int main()
{
int m,n,i,j,i1,j1,i2,j2;
in>>m>>n;
for(i = 1; i <= m; i++)
in>>(1 + v[i]);
for(i = 0; i <= m + 1; i++)
{
d[i][0] = -1;
d[i][n + 1] = -1;
}
for(j = 0; j <= n + 1; j++)
{
d[0][j] = -1;
d[m + 1][j] = -1;
}
for(i = 1; i <= m; i++)
for(j = 1; j <= n; j++)
if(v[i][j] == 'D')
{
d[i][j] = 1;
q.push((pozitie){i,j});
}
else if(v[i][j] == 'I')
{
i1 = i;
j1 = j;
}
else if(v[i][j] == 'O')
{
i2 = i;
j2 = j;
}
pozitie x;
while(!q.empty())
{
x = q.front();
q.pop();
pozitie y;
for(i = 0; i < 4; i++)
{
y.lin = x.lin + dlin[i];
y.col = x.col + dcol[i];
if(!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(v[i][j] == '*')
d[i][j] = -1;
for(i = 1; i <= m; i++)
{
for(j = 1; j <= n; j++)
out<<d[i][j]<<'\t';
out<<'\n';
}
d1[i1][j1] = d[i1][j1];
out<<barbar((pozitie){i2,j2});
return 0;
}