Cod sursa(job #639458)

Utilizator Theorytheo .c Theory Data 23 noiembrie 2011 12:08:37
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<fstream>
#include<string>
#define nmax 1002
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char v[nmax][nmax],a[nmax][nmax];
int z[nmax][nmax][5];
int n,m,i,j,x,y,g=0;
short dx[]={0,0,-1,1};
short dy[]={-1,1,0,0};
char t[nmax][nmax][5];
int f[nmax][nmax];
int h[nmax][nmax];
int c[2200000][3];
int l2,c2,l1,c1;
void citire()
{
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		fin.get();
		fin.get(v[i],nmax,'\n');
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			
			a[i][j]=v[i][j-1];
			t[i][j][0]=a[i][j];
			if(a[i][j]=='I')
			{
				l2=i;
				c2=j;
			}
			if(a[i][j]=='O')
			{
				l1=i;
				c1=j;
			}
			if(a[i][j]=='*')
			{
				f[i][j]=-1;
			}
		}
	
}


void leeD()
{
	int i,j,k=0,in,jn,d=1,p=1,l,ok;
	
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			if(t[i][j][0]=='D')
			{
				g++;
				c[g][0]=i;
				c[g][1]=j;
				c[g][2]=g;
			}
		}
	}
	d=g;
	
	while(p<=d)
	{
		
		
		
		
			i=c[p][0];
			j=c[p][1];
			for(k=0;k<4;k++)
			{
				in=i+dx[k];
				jn=j+dy[k];
				if(in>0&&jn>0&&in<=n&&jn<=m&&(f[in][jn]==0))
				{
					
					f[in][jn]=f[i][j]+1;
					d++;
					c[d][0]=in;
					c[d][1]=jn;
				
					ok=1;
				
				}
			
			}
			p++;
		
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			if(t[i][j][0]=='D')
			{
				f[i][j]=0;
			}
		}
	}
	
}

int mini(int x,int y)
{
	if(x>y)
		return y;
	else
		return x;
}
void init()
{
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			h[i][j]=-1;
}

void leef()
{
	int i,j,in,jn,p=1,d=1,k,sum,sum1,min1=32000;
	c[1][0]=l2;
	c[1][1]=c2;
	c[1][2]=f[l2][c2];
	while(p<=d)
	{
		i=c[p][0];
		j=c[p][1];
		sum=c[p][2];
		for(k=0;k<4;k++)
		{
			in=i+dx[k];
			jn=j+dy[k];
			
			if(in>0&&jn>0&&jn<=m&&in<=n&&t[in][jn][0]!='*')
			{
				sum1=mini(sum,f[in][jn]);
				if(sum1>h[in][jn]||h[in][jn]==-1)
				{
					h[in][jn]=sum1;
					d++;
					c[d][0]=in;
					c[d][1]=jn;
					c[d][2]=sum1;
					
				}
			}
		}
		p++;
	}
}
int main()
{
	
	citire();
	leeD();
	//gen2();

	init();
	leef();

	//fout<<l1<<c1<<'\n';
	fout<<h[l1][c1];
	
	fin.close();
	fout.close();
	return 0;
}