Cod sursa(job #2132400)

Utilizator Storm_FireFox1Matei Gardus Storm_FireFox1 Data 15 februarie 2018 19:00:47
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

const int NMAX = 1000;
const int nd = 4;
const int dx[nd] = {-1, 1, 0, 0};
const int dy[nd] = {0, 0, -1, 1};

int startx, starty, stopx, stopy;
int t[NMAX + 2][NMAX + 2], qx[NMAX * NMAX + 1], qy[NMAX * NMAX + 1];

int BFS(int dist)
{
    for(int i = 1; i <= NMAX * NMAX; i++)
    {
        qx[i] = 0;
        qy[i] = 0;
    }
    qx[1] = startx;
    qy[1] = starty;
    v[startx][starty] = 1;
    int qb = 1, qe = 1;
    while(qb <= qe)
    {
        int x = qx[qb], y = qy[qb];
        qb++;
        for(int i = 0; i < nd; i++)
        {
            int xn = x + dx[i], yn = y + dy[i];
            if(v[xn][yn] == 0 && v[xn + dist][yn] != -2 && v[xn - dist][yn] != -2 && v[xn][yn + dist] != -2 && v[xn][yn - dist] != -2)
            {
                v[xn][yn] = v[x][y] + 1;
                ++qe;
                qx[qe] = xn;
                qy[qe] = yn;
            }
        }
    }
    return v[stopx][stopy];
}

int cautbin(int n)
{
    int sol = 0, n2;
    for(n2 = 1; n2 * 2 <= n; n2*=2)
    {
    }
    for(int i = n2; i > 0; i/=2)
    {
        if(sol + i <= n && BFS(sol + i) != 0)
        {
            sol += i;
        }
    }
    if(sol == 0)
    {
        return -1;
    }
    else
    {
    return sol;
    }
}

int main()
{
    int n, m;
    fin >> n >> m;
    string s;
    getline(fin, s);
    for(int i = 1; i <= n; ++i) {
        getline(fin, s);
        for(int j = 0; j < int(s.size()); ++j) {
            if( s[j] == 'I' ) {
                startx = i;
                starty = j + 1;
            }
            if(s[j] == 'O') {
                stopx = i;
                stopy = j + 1;
            }
            if(s[j] == '*') {
                t[i][j + 1] = -1;
            }
            if(s[j] == 'D') {
                t[i][j + 1] = -2;
            }
        }
    }
    for(short i = 0; i <= n + 1; i++)
    {
        t[0][i] = NMAX*NMAX + 1;
        t[n + 1][i] = NMAX*NMAX + 1;
        t[i][0] = NMAX*NMAX + 1;
        t[i][m + 1] = NMAX*NMAX + 1;
    }
    int dist = max(n, m) - 1;
    fout << cautbin(dist) << "\n";
    return 0;
}