Cod sursa(job #1138682)

Utilizator raulstoinStoin Raul raulstoin Data 10 martie 2014 13:58:44
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<fstream>
#include<queue>
#include<algorithm>
#include<vector>

#define NMAX 1005
#define oo (1<<30)
#define PII pair<int,int> 

using namespace std;

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

int n,m,xi,yi,xf,yf,v[NMAX][NMAX],dragons[NMAX][NMAX],dx[]={0,1,0,-1},dy[]={1,0,-1,0};
queue<short> L,C;
bool use[NMAX][NMAX],inqueue[NMAX][NMAX];

struct coord_cmp
{
	bool operator ()(PII &a,PII &b)
	{
		return dragons[a.first][a.second]<dragons[b.first][b.second];
	}
};
priority_queue<PII,vector<PII>,coord_cmp> Heap;

void Lee()
{
	for(int r,c;L.size();L.pop(),C.pop())
	{
		r=L.front();
		c=C.front();
		for(int i=0;i<4;i++)
		{
			int ii=r+dx[i],jj=c+dy[i];
			if(dragons[ii][jj])
				continue;
			dragons[ii][jj]=dragons[r][c]+1;
			L.push(ii);
			C.push(jj);
		}
	}
}

void borders()
{
	for(int i=0;i<=n+1;i++)
		v[i][0]=v[i][m+1]=dragons[i][0]=dragons[i][m+1]=-1;
	for(int i=0;i<=m+1;i++)
		v[0][i]=v[n+1][i]=dragons[0][i]=dragons[n+1][i]=-1;
}

void path()
{
	v[xi][yi]=dragons[xi][yi];
	Heap.push(make_pair(xi,yi));
	for(int r,c;Heap.size();)
	{
		r=Heap.top().first;
		c=Heap.top().second;
		Heap.pop();
		if(use[r][c])
			continue;
		use[r][c]=1;
		if(r==xf && c==yf)
			return;
		for(int i=0;i<4;i++)
		{
			int ii=r+dx[i],jj=c+dy[i];
			if(use[ii][jj] || v[ii][jj]==-1)
				continue;
			v[ii][jj]=max(v[ii][jj],min(v[r][c],dragons[ii][jj]));
			if(!Heap.size() || !inqueue[ii][jj])
			{
				Heap.push(make_pair(ii,jj));
				inqueue[ii][jj]=1;
			}
			else
			{
				pair<short,short> x=Heap.top();
				Heap.pop();
				Heap.push(x);
			}
		}
	}
}

int main()
{
	fin>>n>>m;
	fin.get();
	char c;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			fin.get(c);
			switch(c)
			{
				case '*': v[i][j]=-1; dragons[i][j]=-1; break;
				case 'D': L.push(i); C.push(j); dragons[i][j]=1; break;
				case 'I': xi=i; yi=j; break;
				case 'O': xf=i; yf=j; break;
				default: break;
			}
		}
		fin.get();
	}
	borders();
	Lee();
	path();
	if(!v[xf][yf])
		fout<<"-1";
	else
		fout<<v[xf][yf]-1;
	return 0;
}