Cod sursa(job #1610418)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 23 februarie 2016 15:21:58
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;

#define NMAX 1003
#define INF (1<<30)

struct coada {
	int x,y;
};

char a[NMAX][NMAX];
coada c[NMAX*NMAX];
int d[NMAX][NMAX],viz[NMAX][NMAX];
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};

void getDistances(int n, int m)
{
	int i,j,st,dr;
	coada aa,b;
	st=1;
	dr=0;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++) {
			d[i][j]=INF;
			if(a[i][j]=='D') {
				d[i][j]=0;
				c[++dr].x=i;
				c[dr].y=j;
			}
		}
	while(st<=dr) {
		aa=c[st];
		st++;
		for(i=1;i<=4;i++) {
			b.x=aa.x+dx[i];
			b.y=aa.y+dy[i];
			if(a[b.x][b.y]!='*' && d[b.x][b.y]>d[aa.x][aa.y]+1) {
				d[b.x][b.y]=d[aa.x][aa.y]+1;
				c[++dr]=b;
			}
		}
	}
}

int possible(int n, int m, int val)
{
	int i,j,st,dr;
	coada aa,b;
	st=1;
	dr=0;
	memset(viz,0,sizeof(viz));
	for(i=0;i<=n+1;i++) {
		viz[i][0]=1;
		viz[i][m+1]=1;
	}
	for(j=0;i<=m+1;j++) {
		viz[0][j]=1;
		viz[n+1][j]=1;
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++) 
			if(a[i][j]=='I') {
				c[++dr].x=i;
				c[dr].y=j;
				viz[i][j]=1;
				if(d[i][j]<val)
					return 0;
				break;
			}
	while(st<=dr) {
		aa=c[st];
		st++;
		for(i=1;i<=4;i++) {
			b.x=aa.x+dx[i];
			b.y=aa.y+dy[i];
			if(a[b.x][b.y]!='*' && d[b.x][b.y]>=val && viz[b.x][b.y]==0) {
				if(a[b.x][b.y]=='O')
					return 1;
				c[++dr]=b;
				viz[b.x][b.y]=1;
			}
		}
	}
	return 0;
}

int main ()
{
	int n,m,i,p,q,mij,sol;
	ifstream f("barbar.in");
	ofstream g("barbar.out");
	f>>n>>m;
	for(i=1;i<=n;i++)
		f>>(a[i]+1);
	f.close();
	getDistances(n,m);
	p=0;
	q=n+m;
	while(p<=q) {
		mij=(p+q)/2;
		if(possible(n,m,mij)) {
			sol=mij;
			p=mij+1;
		}
		else q=mij-1;
	}
	g<<sol;
	g.close();
	return 0;
}