Cod sursa(job #1542360)

Utilizator akaprosAna Kapros akapros Data 5 decembrie 2015 12:27:50
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <bits/stdc++.h>
#define pb push_back
#define maxN 1002
using namespace std;
int n, m, d[maxN][maxN], pi, pj, oi, oj;
char a[maxN][maxN];
bool vis[maxN][maxN];
struct coord
{
   int x, y;
}e;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int okc(int x, int y)
{
    return (x >= 1 && y >= 1 && x <= n && y <= m);
}
/*struct comp
{
    bool operator() (const coord &X, const coord &Y)
    {
        return X.x + X.y < Y.x + Y.y;
    }
};
priority_queue < coord , vector < coord >, comp> Q;*/
deque < coord > q;
void read()
{
    int i, j;
    freopen("barbar.in", "r", stdin);
    scanf("%d %d\n", &n, &m);
    int inf = m * n + 1;
    for (i = 1; i <= n; ++ i)
    {
        gets(a[i] + 1);
        for (j = 1; j <= m; ++ j)
        {
            if (a[i][j] == 'O')
               oi = i, oj = j;
            if (a[i][j] == 'I')
               pi = i, pj = j;

            d[i][j] = inf;
            if (a[i][j] == 'D')
            {
                d[i][j] = 0;
                e.x = i; e.y = j;
                q.push_back(e);
            }
        }
    }
}
void solve()
{
    int i, j;
    coord node;
    while (!q.empty())
    {
        node = q.front();
        q.pop_front();
        for (int k = 0; k < 4; ++ k)
        if (okc(node.x + dx[k], node.y + dy[k]) && d[node.x + dx[k]][node.y + dy[k]] > d[node.x][node.y] + 1)
            {
                d[node.x + dx[k]][node.y + dy[k]] = d[node.x][node.y] + 1;
                e.x = node.x + dx[k]; e.y = node.y + dy[k];
                q.push_back(e);
            }
    }
}
int ok(int x)
{
   memset(vis, 0, sizeof(vis));
   vis[pi][pj] = 1;
   q.clear();
   e.x = pi; e.y = pj;
   q.push_back(e);
       coord node;
    vis[pi][pj] = 1;
    while (!q.empty())
    {
        node = q.front();
        q.pop_front();
        for (int k = 0; k < 4; ++ k)
        if (okc(node.x + dx[k], node.y + dy[k]) && d[node.x + dx[k]][node.y + dy[k]] >= x && !vis[node.x + dx[k]][node.y + dy[k]])
            {
                e.x = node.x + dx[k]; e.y = node.y + dy[k];
                vis[node.x + dx[k]][node.y + dy[k]] = 1;
                q.push_back(e);
            }
        if (vis[oi][oj])
           return 1;
    }
   return vis[oi][oj];
}
int bs()
{
   int i = 0, p = 1 << 19;
   while (p)
   {
       if (i + p < m * n && ok(i + p))
          i += p;
        p /= 2;
   }
   return i;
}
void write()
{
    freopen("barbar.out", "w", stdout);
    printf("%d", bs());
}
int main()
{
    read();
    solve();
    write();
    return 0;
}