Pagini recente » Cod sursa (job #3134609) | Cod sursa (job #1408373) | Cod sursa (job #3176081)
#include <fstream>
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int di[] = { 0,-1,0,1 };
int dj[] = { -1,0,1,0 };
int a[1005][1005], mat[1005][1005], b[1005][1005];
int n, m;
queue<pair<int, int>> q;
void board()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
mat[i][j] = 2e9;
for (int i = 0; i <= n + 1; i++)
a[i][0] = a[i][m + 1] = -1;
for (int j = 0; j <= m + 1; j++)
a[0][j] = a[m + 1][j] = -1;
}
void lee()
{
while (!q.empty())
{
int i = q.front().first, j = q.front().second;
q.pop();
for (int k = 0; k <= 3; k++)
{
int inou, jnou;
inou = i + di[k];
jnou = j + dj[k];
if (a[inou][jnou] != -1 && mat[i][j] + 1 < mat[inou][jnou])
{
mat[inou][jnou] = mat[i][j] + 1;
q.push({ inou,jnou });
}
}
}
}
void Fill(int i, int j, int mij)
{
if (a[i][j] != -1 && mat[i][j] >= mij)
{
a[i][j] = -1;
Fill(i + 1, j, mij);
Fill(i - 1, j, mij);
Fill(i, j - 1, mij);
Fill(i, j + 1, mij);
}
}
int main()
{
fin >> n >> m;
int lin, col;
int l, c;
board();
for (int i = 1; i <= n; i++)
{
char s[1005];
fin.getline(s, 1005);
for (int j = 0; s[j]; j++)
{
if (s[j] == 'I')
lin = i, col = j + 1;
else if (s[j] == 'D')
q.push({ i,j + 1 }), mat[i][j + 1] = 0;
else if (s[j] == 'O')
l = i, c = j + 1;
else if (s[j] == '*')
a[i][j+1] = -1;
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
b[i][j] = a[i][j];
lee();
int st = 0;
int dr = min(mat[lin][col], mat[l][c]);
int ans;
while (st <= dr)
{
int mij = (st + dr) / 2;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] = b[i][j];
Fill(st, dr, mij);
if (a[l][c] == -1)
ans = mij, dr = mij - 1;
else
st = mij + 1;
}
fout << ans;
return 0;
}