Cod sursa(job #80716)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 29 august 2007 15:57:39
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
# include <stdio.h>

const long int MAXN=110;
const short vi[9]={0,-1,-1,0,1,1,1,0,-1};
const short vj[9]={0,0,1,1,1,0,-1,-1,-1};
typedef short MATRICE[MAXN+1][MAXN+1];
MATRICE romeo,julieta,map;
long int n,m,rj,ri,jj,ji,besti,bestj,best=-1;

void citire()
{
char s[1000];
FILE *f=fopen("rj.in","r");
fscanf(f,"%ld%ld",&n,&m);
fgets(s,200,f);
long int i,j;
for (i=1;i<=n;i++)
	{
	fgets(s+1,200,f);
	for (j=1;j<=m;j++)
		switch (s[j])
			{
			case ' ': map[i][j]=1; break;
			case 'X': map[i][j]=0; break;
			case 'R': map[i][j]=1; ri=i;rj=j; break;
			case 'J': map[i][j]=1; ji=i;jj=j; break;
			default: map[i][j]=1; break;
			}
	}
fclose(f);
}

void fill(MATRICE &c, long int ii, long int ji)
{
struct {short i,j;} cd[MAXN*MAXN+1];
long int prim,ultim;
short inou,jnou,dir;
prim=ultim=1;cd[1].i=ii;cd[1].j=ji;
c[ii][ji]=1;
while (prim<=ultim)
	{
	for (dir=1;dir<=8;dir++)
		{
		inou=cd[prim].i+vi[dir];
		jnou=cd[prim].j+vj[dir];
		if (inou<=n&&inou>0&&jnou<=m&&jnou>0&&map[inou][jnou]&&!c[inou][jnou])
			{
			++ultim;
			cd[ultim].i=inou;
			cd[ultim].j=jnou;
			c[inou][jnou]=c[cd[prim].i][cd[prim].j]+1;
			}
		}
	++prim;
	}
}

void calculeaza()
{
long int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
	if (map[i][j]&&romeo[i][j]==julieta[i][j]&&romeo[i][j]&&(romeo[i][j]<best||best==-1))
		{
		best=romeo[i][j];
		besti=i;
		bestj=j;
		}
}

void scrie()
{
FILE *g=fopen("rj.out","w");
fprintf(g,"%ld %ld %ld\n",best,besti,bestj);
fcloseall();
}

int main()
{
citire();
fill(romeo,ri,rj);
fill(julieta,ji,jj);
calculeaza();
scrie();
return 0;
}