Cod sursa(job #477880)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 16 august 2010 15:18:45
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <queue>
#define Nmax 1005
#define pb push_back
#define mp make_pair
#define x first
#define y second

using namespace std;

queue< pair< int,int > > Q;
int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};
char s[Nmax][Nmax];
int dist[Nmax][Nmax],use[Nmax][Nmax];
int n,m,rez,xi,yi,xf,yf;

void dist_d(){
	pair< int,int > p; int k,xx,yy;
	
	while( ! Q.empty() ){
		p=Q.front(); Q.pop();
		for(k=0;k<4;++k){
			xx=p.x+dx[k]; yy=p.y+dy[k];
			if( xx>0 && yy>0 && xx<=n && yy<=m && s[xx][yy]=='.')
			if( ! dist[xx][yy] ){
				dist[xx][yy] = dist[p.x][p.y]+1;
				Q.push(mp(xx,yy));
			}
		}
	}
}

inline int merge(int val){
	pair<int,int> p; int k,xx,yy;
	while( ! Q.empty() ) Q.pop();
	Q.push(mp(xi,yi));
	if( dist[xi][yi] < val ) return 0;
	
	while( ! Q.empty() ){
		p=Q.front(); Q.pop();
		if( p.x == xf && p.y==yf ) return 1;
		
		for(k=0;k<4;++k){
			xx=p.x+dx[k]; yy=p.y+dy[k];
			if( xx>0 && yy>0 && xx<=n && yy<=m && s[xx][yy]=='.' )
				if( dist[p.x+dx[k]][p.y+dy[k]] >= val && use[p.x+dx[k]][p.y+dy[k]]!=val ){
					Q.push(mp(p.x+dx[k],p.y+dy[k]));
					use[p.x+dx[k]][p.y+dy[k]]=val;
				}
		}
	}
	return 0;
}	

void caut_bin(){
	int l=0,r=n*m,mij;
	
	while( l<=r ){
		mij=l+(r-l)/2;
		if( merge(mij) ) rez=mij, l=mij+1;
		else r=mij-1;
	}
}

int main(){
	int i,j;
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	for(i=1;i<=n;++i) 
		scanf("%s\n",s[i]+1);
	
	for(i=1;i<=n;++i)
		for(j=1;j<=m;++j)
			if(s[i][j]=='D') Q.push(mp(i,j)); else
			if(s[i][j]=='O') xf=i, yf=j, s[i][j]='.'; else
			if(s[i][j]=='I') xi=i, yi=j, s[i][j]='.';
	
	dist_d();
	caut_bin();
	
	printf("%d\n",rez);
	fclose(stdin); fclose(stdout);
	return 0;
}