Cod sursa(job #2033534)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 6 octombrie 2017 22:40:43
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>
#define NMAX 1005
#define MOD 666013
#define INF 0x3f3f3f3f
#define x first
#define y second
#define pb push_back

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

char mat[NMAX][NMAX];
bool viz[NMAX][NMAX];
queue<pair<int,int> > Q;
int dlin[4]={0,1,0,-1},startx,starty,finishx,finishy;
int dcol[4]={1,0,-1,0},dist[NMAX][NMAX];

bool check(int verif) {
	int x,y,newx,newy,i;

	memset(viz,0,sizeof(viz));

	Q.push({startx,starty});
	viz[startx][starty]=1;
	while(!Q.empty()) {
		x=Q.front().first;
		y=Q.front().second;
		Q.pop();

		for(i=0;i<4;++i) {
			newx=x+dlin[i];
			newy=y+dcol[i];

			if(!viz[newx][newy] && mat[newx][newy]!='*' && dist[newx][newy]>=verif) {
				viz[newx][newy]=1;
				Q.push({newx,newy});
			}
		}
	}

	return viz[finishx][finishy];
}

int main() {
    int n,m,i,j,x,y,newx,newy,st,dr,mid;

	fin>>n>>m;

	for(i=1;i<=n;++i) {
		for(j=1;j<=m;++j) {
			fin>>mat[i][j];

			if(mat[i][j]=='I') {
				startx=i;
				starty=j;
			}
			else if(mat[i][j]=='O') {
				finishx=i;
				finishy=j;
				dist[i][j]=1;
			}
			else if(mat[i][j]=='D') Q.push({i,j});
		}
	}

	for(i=1;i<=n;++i) mat[i][0]=mat[i][m+1]='*';
	for(i=1;i<=m;++i) mat[0][i]=mat[n+1][i]='*';

	while(!Q.empty()) {
		x=Q.front().first;
		y=Q.front().second;
		Q.pop();

		for(i=0;i<4;++i) {
			newx=x+dlin[i];
			newy=y+dcol[i];

			if(mat[newx][newy]!='*' && dist[newx][newy]==0) {
				dist[newx][newy]=dist[x][y]+1;
				Q.push({newx,newy});
			}
		}
	}

	st=1;
	dr=INF;
	while(st<=dr) {
		mid=(st+dr)/2;

		if(check(mid)) st=mid+1;
		else dr=mid-1;
	}

	if(dr==0) fout<<-1;
	else fout<<dr-1;

    return 0;
}