Cod sursa(job #2571429)

Utilizator FrostfireMagirescu Tudor Frostfire Data 4 martie 2020 23:09:15
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#define NMAX 1000

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

int n, m, v[NMAX+10][NMAX+10];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
pair <int, int> start, exit;
bool viz[NMAX+10][NMAX+10], w[NMAX+10][NMAX+10];
queue <pair <int, int> > Q;

void bfsDragoni()
{   while(!Q.empty())
        {   pair <int, int> a = Q.front();
            Q.pop();
            for(int t=0; t<4; t++)
                {   pair <int, int> vec;
                    vec.first = a.first + dx[t];
                    vec.second = a.second + dy[t];
                    if(vec.first && vec.second && vec.first <= n && vec.second <= m
                       && !viz[vec.first][vec.second])
                        {   viz[vec.first][vec.second] = 1;
                            v[vec.first][vec.second] = v[a.first][a.second] + 1;
                            Q.push(vec);
                        }
                }
        }
}

int isOk(int val)
{   while(!Q.empty()) Q.pop();
    memset(viz, 0, sizeof(viz));
    Q.push(start);
    viz[start.first][start.second] = 1;
    while(!Q.empty())
        {   pair <int, int> a = Q.front();
            Q.pop();
            if(a.first == exit.first && a.second == exit.second) return 1;
            for(int t=0; t<4; t++)
                {   pair <int, int> vec;
                    vec.first = a.first + dx[t];
                    vec.second = a.second + dy[t];
                    if(vec.first && vec.second && vec.first <= n && vec.second
                       && !w[vec.first][vec.second] && !viz[vec.first][vec.second] && v[vec.first][vec.second] >= val)
                        {   viz[vec.first][vec.second] = 1;
                            Q.push(vec);
                        }
                }
        }
    return 0;
}

int main()
{
    f >> n >> m;
    for(int i=1; i<=n; i++)
        {   string s;
            f >> s;
            for(int j=0; j<m; j++)
                {   if(s[j] == '.') continue;
                    else if(s[j] == 'D') Q.push(make_pair(i, j+1)), viz[i][j+1] = 1;
                    else if(s[j] == '*') viz[i][j+1] = 1, w[i][j+1] = 1;
                    else if(s[j] == 'I') start = make_pair(i, j+1);
                    else if(s[j] == 'O') exit = make_pair(i, j+1);
                }
        }
    bfsDragoni();
    int st=1, dr=2*NMAX;
    while(st <= dr)
        {   int mij = (st + dr) / 2;
            if(isOk(mij)) st = mij + 1;
            else dr = mij - 1;
        }
    g << dr << '\n';
    return 0;
}