Cod sursa(job #637807)

Utilizator Theorytheo .c Theory Data 20 noiembrie 2011 16:51:40
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 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][1000];
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][1000];
int f[nmax][nmax];
int h[nmax][nmax];
int c[500000][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]=-2;
			}
		}
	
}
void gen(int g)
{
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			t[i][j][g]=t[i][j][0];
}

void leeD(int x,int y,int &g)
{
	int i,j,k=0,in,jn,d=1,p=1;
	g++;
	gen(g);
	c[1][0]=x;
	c[1][1]=y;
	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&&t[in][jn][g]!='*'&&(f[in][jn]==0||f[in][jn]>z[i][j][g]+1))
			{
				z[in][jn][g]=z[i][j][g]+1;
				f[in][jn]=z[in][jn][g];
				d++;
				c[d][0]=in;
				c[d][1]=jn;
				t[in][jn][g]='*';
				
			}
			
		}
		p++;
		
	}
	f[x][y]=0;
}
void gen2()
{
	int i,j;
	for(i=1;i<=n;i++)
		for(j=2;j<=m;j++)
		{
			if(t[i][j][0]=='D')
				leeD(i,j,g);
		}

		
}
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();
	gen2();
	init();
	
	leef();

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