Cod sursa(job #1600420)

Utilizator mariakKapros Maria mariak Data 14 februarie 2016 23:31:22
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <bits/stdc++.h>
#define Dim 1002
FILE *fin = freopen("barbar.in", "r", stdin);
FILE *fout = freopen("barbar.out", "w", stdout);

using namespace std;
int n, m, Sol, M[Dim][Dim];
bool vis[Dim][Dim];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
char C[Dim][Dim];
struct nod
{
    int x;
    int y;
    int d;
}xi, xf, xx, yy;
deque <nod> Q;
void read()
{
    scanf("%d %d\n", &n, &m);
    for(int i = 1; i <= n; ++ i)
        gets(C[i] + 1);
}
void bord()
{
    int i;
    for(i = 0; i <= n + 1; ++ i)
        M[i][0] = M[i][m + 1] = -1;
    for(i = 0; i <= m + 1; ++ i)
        M[0][i] = M[n + 1][i] = -1;
}
void asf()
{
    int i, j;
    for (i = 0; i <= n + 1; ++ i)
    {
        for (j = 0; j <= m + 1; ++ j)
            printf("%d ", M[i][j]);
        printf("\n");
    }
}
void dist()
{
    while(!Q.empty())
    {
        xx = Q.front();
        Q.pop_front();
        for(int k = 0; k < 4; ++ k)
        {
            yy.x = xx.x + dx[k];
            yy.y = xx.y + dy[k];
            yy.d = xx.d + 1;
            if(M[yy.x][yy.y] > yy.d)
            {
                M[yy.x][yy.y] = yy.d;
                Q.push_back(yy);
            }
        }
    }
    //asf();
}
bool way(int dist)
{
    Q.clear();
    Q.push_back(xi);
    memset(vis, 0, sizeof(vis));
    while(!Q.empty())
    {
        xx = Q.front();
        Q.pop_front();
        for(int k = 0; k < 4; ++ k)
        {
            yy.x = xx.x + dx[k];
            yy.y = xx.y + dy[k];
            if(M[yy.x][yy.y] >= dist && M[yy.x][yy.y] != Dim * Dim  && !vis[yy.x][yy.y])
            {
                if(yy.x == xf.x && yy.y == xf.y)
                    return 1;
                Q.push_back(yy);
                vis[yy.x][yy.y] = 1;
            }
        }
    }
    return 0;
}
int bsearch()
{
    int i = 0, p = 1 << 20;
    while(p)
    {
        if(i + p < Dim * Dim && way(i + p))
            i += p;
        p /= 2;
    }
    return i;
}
void solve()
{
    int i, j;
    for(i = 1; i <= n; ++ i)
        for(j = 1; j <= m; ++ j)
    {
        if(C[i][j] == 'D')
        {
            xx.x = i;
            xx.y = j;
            xx.d = 0;
            Q.push_back(xx);
        }
        if(C[i][j] == '*')
            M[i][j] = -1;
        if(C[i][j] == 'I')
            xi.x = i, xi.y = j, M[i][j] = Dim * Dim;
        if(C[i][j] == 'O')
            xf.x = i, xf.y = j, M[i][j] = Dim * Dim;
        if(C[i][j] == '.')
            M[i][j] = Dim * Dim;
    }
    dist();
    Sol = bsearch();
}
void write()
{
    if(!Sol)
        printf("-1\n");
    else printf("%d\n", Sol);
}
int main()
{
    read();
    bord();
    solve();
    write();
    return 0;
}