Cod sursa(job #1125130)

Utilizator TudorMTudor Moldovanu TudorM Data 26 februarie 2014 15:50:11
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<cstdio>
using namespace std;
FILE *f=fopen("rj.in","r");
FILE *g=fopen("rj.out","w");
int n, m, a[102][102],b[102][102], xj, yj, xr, yr, tmin=10000000, x,y;
int dx[]={-1,-1,-1,0,1,1,1,0},dy[]={-1,0,1,1,1,0,-1,-1};
struct{int x,y;}c[10500],d[10500];
char h;
int interior(int x, int y)
{
	if(x>=1&&x<=n&&y>=1&&y<=m)return 1;
	return 0;
}
void citeste()
{
	int i, j;
	fscanf(f,"%d %d",&n,&m);
	fscanf(f,"%c",&h);
	for(i=1;i<=n;i++)
	{
	
		for(j=1;j<=m;j++)
		{
			fscanf(f,"%c",&h);
			if(h==' ')a[i][j]=b[i][j]=0;
			else if(h=='X')a[i][j]=b[i][j]=-1;
			else if(h=='R')
			{
				a[i][j]=b[i][j]=0;
				xr=i;
				yr=j;
			}
			else
			{
				a[i][j]=b[i][j]=0;
				xj=i;
				yj=j;
			}
		}
		fscanf(f,"%c",&h);
	}
}
void romeo(int x, int y)
{
	int i, j, xv,yv,p,u;
	p=u=1;
	c[u].x=x;
	c[u].y=y;
	a[x][y]=1;
	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)&&a[xv][yv]==0)
			{
				a[xv][yv]=a[x][y]+1;
				c[++u].x=xv;
				c[u].y=yv;
			}
		}
	}
}
void julieta(int x, int y)
{
	int i, j, xv, yv, p, u;
	p=u=1;
	d[u].x=x;
	d[u].y=y;
	b[x][y]=1;
	while(p<=u)
	{
		x=d[p].x;
		y=d[p++].y;
		for(i=0;i<=7;i++)
		{
			xv=x+dx[i];
			yv=y+dy[i];
			if(interior(xv,yv)&&b[xv][yv]==0)
			{
				b[xv][yv]=b[x][y]+1;
				d[++u].x=xv;
				d[u].y=yv;
			}
		}
	}
}
int main()
{
	int i, j;
	citeste();
	romeo(xr,yr);
	julieta(xj,yj);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			if(a[i][j]==b[i][j]&&a[i][j]>0&&a[i][j]<tmin)
			{
				tmin=a[i][j];
				x=i;
				y=j;
			}
		}
	}
	fprintf(g,"%d %d %d",tmin,x,y);
	fclose(f);
	fclose(g);
	return 0;
}