Cod sursa(job #484264)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 13 septembrie 2010 10:11:26
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

#define MAXN 1005
char mat[MAXN][MAXN];
int b[MAXN][MAXN];
int sol[MAXN][MAXN];
int n,m;

inline int min(const int a, const int b)
{
	return a<b?a:b;
}

int GetNeighbors(int x, int y, pair<int,int> v[4])
{
	int num=0;
	if(x-1>=1)
	{
		v[num++]=make_pair(x-1,y);
	}
	if(x+1<=n)
	{
		v[num++]=make_pair(x+1,y);
	}
	if(y-1>=1)
	{
		v[num++]=make_pair(x,y-1);
	}
	if(y+1<=m)
	{
		v[num++]=make_pair(x,y+1);
	}
	return num;
}

void sort(pair<int,int> v[4], int num)
{
	bool ord;
	pair<int,int> aux;
	do
	{
		ord=false;
		for(int i=0; i<num; ++i)
			if( b[v[i].first][v[i].second] <
				b[v[i+1].first][v[i+1].second])
			{
				aux=v[i];
				v[i]=v[i+1];
				v[i+1]=aux;
				ord=true;
			}
	}while(ord);
}

int main()
{
	fstream fin("barbar.in", fstream::in);
	fstream fout("barbar.out", fstream::out);
	queue<pair<int,int> > Q;
	pair<int,int> start,end;
	
	fin>>n>>m;
	//cout<<n<<" "<<m<<endl;
	for(int i=1; i<=n; ++i)
	{
		for(int j=1; j<=m; ++j)
		{
			fin>>mat[i][j];
			sol[i][j]=-1;
			switch(mat[i][j])
			{
				case 'D':
				{
					Q.push(make_pair(i,j));
					b[i][j]=0;
				}; break;
				case '*':
				{
					b[i][j]=-2;
				}; break;
				case 'I':
				{
					start=make_pair(i,j);
					b[i][j]=-1;
				}; break;
				case 'O':
				{
					end=make_pair(i,j);
					b[i][j]=-1;
				}; break;
				default:
					b[i][j]=-1;
			}
			//cout<<mat[i][j];
		}
		//cout<<endl;
	}

	while(!Q.empty())
	{
		pair<int,int> node=Q.front(), v[4];
		int num=GetNeighbors(node.first,node.second,v);
		Q.pop();
		
		for(int i=0; i<num; ++i)
		{
			if( b[v[i].first][v[i].second]==-1 ||
				b[node.first][node.second]+1<b[v[i].first][v[i].second])
			{
				Q.push(v[i]);
				b[v[i].first][v[i].second]=b[node.first][node.second]+1;
			}
		}
	}
	
	fout<<-1;
	
	return 0;
	
	/*cout<<endl;
	for(int i=1; i<=n; ++i)
	{
		for(int j=1; j<=m; ++j)
		{
			cout<<b[i][j]<<" ";
		}
		cout<<endl;
	}*/
	
	if(b[end.first][end.second]==-1)
	{
		//cout<<"No solution\n";
		fout<<-1;
	}
	
	//cout<<endl;
	
	Q.push(start);
	sol[start.first][start.second]=b[start.first][start.second];
	while(!Q.empty())
	{
		pair<int,int> node=Q.front(), v[4];
		int num=GetNeighbors(node.first,node.second,v);
		Q.pop();
		sort(v,num);
		
		//if(node.first==end.first && node.second==end.second)
		//	break;

		for(int i=0; i<num; ++i)
		{
			if(sol[v[i].first][v[i].second]==-1)
			{
				sol[v[i].first][v[i].second]=
					min(sol[node.first][node.second],b[v[i].first][v[i].second]);
				Q.push(v[i]);
			}
			else
			{
				int minimum=min(sol[node.first][node.second],b[v[i].first][v[i].second]);
				if(minimum>sol[v[i].first][v[i].second])
				{
					sol[v[i].first][v[i].second]=minimum;
					Q.push(v[i]);
				}
			}
		}
	}
	//cout<<start.first<<" "<<start.second<<endl;
	//cout<<end.first<<" "<<end.second<<endl;
	fout<<sol[end.first][end.second]<<endl;
	/*for(int i=1; i<=n; ++i)
	{
		for(int j=1; j<=m; ++j)
		{
			cout<<sol[i][j]<<" ";
		}
		cout<<endl;
	}*/
	
	fin.close();
	fout.close();
	return 0;
}