Cod sursa(job #2526516)

Utilizator matei123Biciusca Matei matei123 Data 18 ianuarie 2020 19:08:27
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("barbar.in"); ofstream g("barbar.out");
int r, c;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
char tj[1005][1005];
int drag[1005][1005],tabel[1005][1005];
pair <int, int> I, O;
queue <pair<int, int>> D, paf;
void lee(int cap)
{   while (!paf.empty())
    {   pair <int, int> now = paf.front();
		paf.pop();
        for (int i = 0; i <= 3; i++)
        {   int x = now.first + dx[i];
			int y = now.second + dy[i];
			if (x < 1 || y < 1 || x > r || y > c) continue;
			if (drag[x][y] < cap) continue;
			if (tj[x][y] == '*') continue;
			if (tabel[x][y]) continue;
			tabel[x][y] = 1;
			paf.push(make_pair(x, y));
		}
	}
}
void rezolvare()
{   int st = 1,ans = -1;
	int dr = drag[I.first][I.second];
	while (st <= dr)
    {   int mid = (st + dr) / 2;
		tabel[I.first][I.second] = 1;
		paf.push(I);
		lee(mid);
		if (tabel[O.first][O.second])
		{   st = mid + 1;
			ans = mid;
		}
		else dr = mid - 1;
		for (int i = 1; i <= r; i++)
            for (int j = 1; j <= c; j++) tabel[i][j] = 0;
	}
	g << ans;
}
int main()
{   f >> r >> c;
	for (int i = 1; i <= r; i++)
    {   for (int j = 1; j <= c; j++)
        {   drag[i][j] = 1e9;
			f >> tj[i][j];
			if (tj[i][j] == 'I') I = { i, j };
			if (tj[i][j] == 'O') O = { i, j };
			if (tj[i][j] == 'D')
            {   D.push({ i,j });
				drag[i][j] = 0;
			}
		}
	}
	while (!(D.empty()))
    {   pair <int, int> now = D.front();
		D.pop();
		for (int i = 0; i <= 3; i++)
        {   int x = now.first + dx[i];
			int y = now.second + dy[i];
			if (x < 1 || y < 1 || x > r || y > c) continue;
			if (tj[x][y] == '*') continue;
			if (drag[x][y] <= drag[now.first][now.second] + 1) continue;
			drag[x][y] = drag[now.first][now.second] + 1;
			D.push({ x, y });
		}
	}
	rezolvare();
	return 0;
}