Cod sursa(job #3176081)

Utilizator 1gbr1Gabara 1gbr1 Data 26 noiembrie 2023 18:23:33
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#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;
}