Cod sursa(job #681808)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 17 februarie 2012 20:28:14
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <cstdio>
#include <iostream>
#include <string>
#include <deque>
using namespace std;

pair<int,int> start,t;

int xx[]={1,-1,0,0};
int yy[]={0,0,-1,1};

char h[1005][1005];
int dp[1005][1005],n,m,X;
string ln;
deque<pair<int,int> > d;

bool lee2();

int cautbin()
{	
	int li=1,ls=n,mij,rez=-1;
	while(li<=ls)
	{
		mij=(li+ls)/2;
		X=mij;
		if(lee2()==true)// exista drum
			rez=mij,li=mij+1;
		else // nu exista drum
			ls=mij-1;
	}
	return rez;
}


void full()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			dp[i][j]=1<<30;
}
void clrviz(bool viz[1005][1005])
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			viz[i][j]=0;
}


bool lee2()
{
	bool viz[1005][1005]; // drum maxim X
	clrviz(viz);
	d.push_back(make_pair(start.first,start.second));
	while(d.size())
	{
		int x=d.front().first;
		int y=d.front().second;
		d.pop_front();
		for(int t=0;t<4;t++)
		{
			int i=x+xx[t];
			int j=y+yy[t];
			if(i>=1 && i<=n && j>=1 && j<=m && dp[i][j]>=X &&  viz[i][j]==0)
			{
				viz[i][j]=1;
				d.push_back(make_pair(i,j));
			}
		}
		
	}
	return viz[t.first][t.second];
}


void lee() // versiunea 1.0Dragons
{
	while(d.size())
	{
		int x=d.front().first;
		int y=d.front().second;
		d.pop_front();
		for(int t=0;t<4;t++)
		{
			int i=x+xx[t];
			int j=y+yy[t];
			if(i>=1 && i<=n && j>=1 && j<=m && dp[x][y]+1<dp[i][j])
			{
				dp[i][j]=dp[x][y]+1;
				d.push_back(make_pair(i,j));
			}
		}
		
	}


}

int main()
{
	freopen("barbar.in","r", stdin);
	freopen("barbar.out","w", stdout);
	scanf("%d %d\n",&n,&m);
	full();
	for(int i=1;i<=n;i++)
	{
		getline(cin,ln);
		for(int j=1;j<=m;j++)
		{
			h[i][j]=ln[j-1];
			
			if(h[i][j]=='D')
			{
				d.push_back(make_pair(i,j));
				dp[i][j]=0;
			}
			if(h[i][j]=='O')
				t.first=i,t.second=j;
			if(h[i][j]=='I')
				start.first=i,start.second=j;
		}
	}
	lee(); // initial pentru dragoni
	
	printf("%d",cautbin());

	return 0;
}