Cod sursa(job #2316592)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 11 ianuarie 2019 23:03:12
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#define DIM 1010
#include <queue>
#define x first
#define y second
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r,c,i,j,a[DIM][DIM],istart,jstart,istop,jstop,iv,jv,k,st,dr,mid,d[DIM][DIM];
bool ok;
int di[]={-1,1,0,0};
int dj[]={0,0,-1,1};
pair<int,int> v[DIM];
queue< pair<int,int> > q;
char ch[DIM][DIM];
int main() {
	fin>>r>>c;
	for (i=1;i<=r;i++)
		for (j=1;j<=c;j++) {
			fin>>ch[i][j];
			if (ch[i][j]=='I') {
				ch[i][j]='.';
				istart=i;
				jstart=j;
			}
			if (ch[i][j]=='O') {
				ch[i][j]='.';
				istop=i;
				jstop=j;
			}
			if (ch[i][j]=='D') {
				a[i][j]=1;
				v[++k]={i,j};
				q.push({i,j});
			}
		}
	while (!q.empty()) {
		i=q.front().x;
		j=q.front().y;
		q.pop();
		for (int dir=0;dir<4;dir++) {
			iv=i+di[dir];
			jv=j+dj[dir];
			if (iv>=1&&iv<=r&&jv>=1&&jv<=c&&ch[iv][jv]=='.'&&a[iv][jv]==0) {
				a[iv][jv]=1+a[i][j];
				v[++k]={iv,jv};
				q.push({iv,jv});
			}
		}
	}
	st=1, dr=a[v[k].x][v[k].y];
	while (st<=dr) { //caut binar valori astfel incat distanta pana la dragoni sa fie maxima
		mid=(st+dr)/2;//si sa ajung in istop si jstop, pornind din istart si jstart
		if (a[istart][jstart]<mid)
			ok=false;
		else {
			for (i=1;i<=r;i++)
				for (j=1;j<=c;j++)
					d[i][j]=0;
			d[istart][jstart]=1; //d[i][j]=1 - am vizitat celula {i,j}
			q.push({istart,jstart});
			while (!q.empty()&&!ok) {
				i=q.front().x;
				j=q.front().y;
				q.pop();
				for (int dir=0;dir<4;dir++) {
					iv=i+di[dir];
					jv=j+dj[dir];
					if (iv>=1&&iv<=r&&jv>=1&&jv<=c&&a[iv][jv]>=mid&&d[iv][jv]==0) {
						d[iv][jv]=1;
						q.push({iv,jv});
						if (iv==istop&&jv==jstop) {
							ok=true; break;
						}
					}
				}
			}
		}
		if (ok)
			st=mid+1;
		else
			dr=mid-1;
	}
	fout<<dr-2;
	return 0;
}