Cod sursa(job #1744737)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 20 august 2016 11:49:35
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define MAXN 1050
#define inf 0x3fffffff

using namespace std;

struct coord
{
    int x, y;
    coord(int x = 0, int y = 0) : x(x), y(y) { }
}st, fin;

char a[MAXN][MAXN];
bool mat[MAXN][MAXN]; /// 0 inseamna liber
int dd[MAXN][MAXN];
vector<coord> drags;
int n, m;

void citire()
{
	scanf("%d %d\n", &n, &m);
    for (int i = 1; i <= n; i++) {
		gets(a[i]+1);
		for (int j = 1; j <= m; j++)
			if (a[i][j] == 'D')
				drags.push_back(coord(i, j)), mat[i][j] = 1;
			else if (a[i][j] == 'I')
				st = coord(i, j);
            else if (a[i][j] == 'O')
				fin = coord(i, j);
			else if (a[i][j] == '*')
				mat[i][j] = 1;
    }
}
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
queue<coord> q;
void prepare()
{
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			dd[i][j] = inf;
	for (coord c : drags)
		q.push(c), dd[c.x][c.y] = 0;
    for (; !q.empty(); q.pop()) {
        coord top = q.front();
		for (int d = 0; d < 4; d++) {
            int nx = top.x + dx[d];
            int ny = top.y + dy[d];
            if (nx > 0 && nx <= n && ny > 0 && ny <= m && dd[top.x][top.y]+1 < dd[nx][ny]) {
				dd[nx][ny] = dd[top.x][top.y] + 1;
                q.push(coord(nx, ny));
            }
		}
    }
}

void debug()
{
    for (int i = 1; i <= n; i++, printf("\n"))
		for (int j = 1; j <= m; j++)
			printf("%d ", dd[i][j]);
}
int dist[MAXN][MAXN];
int canGo(int prag)
{
	if (dd[st.x][st.y] < prag || dd[fin.x][fin.y] < prag) return 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			dist[i][j] = inf;
	dist[st.x][st.y] = 0;
	while (!q.empty()) q.pop();
    for (q.push(st); !q.empty(); q.pop()) {
        coord top = q.front();
		for (int d = 0; d < 4; d++) {
            int nx = top.x + dx[d];
            int ny = top.y + dy[d];
            if (nx > 0 && nx <= n && ny > 0 && ny <= m && dd[nx][ny] >= prag
				 && !mat[nx][ny] && dist[top.x][top.y]+1 < dist[nx][ny]) {
				dist[nx][ny] = dist[top.x][top.y] + 1;
                if (nx == fin.x && ny == fin.y)
                    return 1;
                q.push(coord(nx, ny));
            }
		}
    }
    return 0;
}

void solve()
{
	int rez = 0, step;
    for (step = 1; step <= n; step <<= 1);
    for (step; step; step >>= 1) {
        if (rez+step <= n && canGo(rez+step))
			rez += step;
    }
    if (rez == 0)
		printf("-1");
	else
		printf("%d", rez);
}

int main()
{
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);

    citire();
    prepare();
	//debug();
	solve();

    return 0;
}