Cod sursa(job #406058)

Utilizator crenguBacaoanu Crenguta crengu Data 1 martie 2010 09:38:50
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<iostream.h>
#include<fstream.h>
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};
typedef struct { int x,y;}PCT;
PCT c[10000];

void citire(int & n, int & m,int  a[][200], int b[][200],PCT & ro, PCT & ju)
{
	FILE *f=fopen("rj.in","r");
	int i,j;
	char c;
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{ fscanf(f,"%c",&c);
		for(j=1;j<=m;j++)
			{
				fscanf(f,"%c", &c);
				if(c=='J'){a[i][j]=-3;ju.x=i;ju.y=j;}
				else if(c=='X')a[i][j]=-1;
				else if(c=='R'){a[i][j]=-2;ro.x=i;ro.y=j;}
				else if(c==' ')a[i][j]=0;
				b[i][j]=a[i][j];
		}
	   
    }
	fclose(f);
}

int interior(int x, int y, int n, int m)
{
	if(x>=1&&x<=n&&y>=1&&y<=m)return 1;
	return 0;
}
void drum(int x, int y, int n, int m, int a[][200])
{
	int p,u,i,xv,yv;
	p=u=1;
	c[u].x=x;
	c[u].y=y;
	a[x][y]=0;
	while(p<=u)
	{x=c[p].x;
	y=c[p++].y;
	for(i=0;i<=7;i++)
	{
		xv=x+dx[i];
		yv=y+dy[i];
		if(interior(xv,yv,n,m)&&a[xv][yv]==0)
		{
			a[xv][yv]=a[x][y]+1;
			c[++u].x=xv;
			c[u].y=yv;
		}
	}
	}
}

int main()
{
	int n,m,a[200][200],b[200][200],i,j,min,s,t;
    PCT ro,ju;
	FILE *g=fopen("rj.out","w");
	citire(n,m,a,b,ro,ju);
	
    drum(ro.x,ro.y,n,m,a);
	drum(ju.x,ju.y,n,m,b);
	min=100000;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			if(a[i][j]==b[i][j]&&a[i][j]>0)
			if(a[i][j]+1<min){min=a[i][j]+1; s=i; t=j;}
			else if(a[i][j]==min&&s>=i){s=i; t=j;}
	
	fprintf(g,"%d %d %d",min,s,t);
		
	
	fclose(g);
	return 0;
}