Cod sursa(job #80698)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 29 august 2007 14:49:57
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<stdio.h>
#include<stdlib.h>
struct nod{
long int x;
long int y;
long int cod;
nod *next;
};
nod *prim,*ultim,*ppp;
char p[105],*pp;
long int m,n,tmin,i,j,R[102][102],J[102][102],xr,yr,xj,yj,xp,yp,xs,ys,mark,
dx[10],dy[10],xsol,ysol,ok;
void pune(long int xx,long int yy,long int cc);
int main()
{
    FILE *f,*g;f=fopen("rj.in","r");g=fopen("rj.out","w");
    fscanf(f,"%ld%ld",&m,&n);
    dx[0]=-1;dx[1]=-1;dx[2]=-1;dx[3]=0;dx[4]=0;dx[5]=1;dx[6]=1;dx[7]=1;
    dy[0]=-1;dy[1]=0;dy[2]=1;dy[3]=-1;dy[4]=1;dy[5]=-1;dy[6]=0;dy[7]=1;
    for(i=0;i<=m+1;i++){R[i][0]=-1;R[i][n+1]=-1;J[i][0]=-1;J[i][n+1]=-1;}
    for(j=0;j<=n+1;j++){R[0][j]=-1;R[m+1][j]=-1;J[0][j]=-1;J[m+1][j]=-1;}
    pp=&p[0];fgets(pp,102,f);
    for(i=1;i<=m;i++)
    { fgets(pp,102,f);
      for(j=1;j<=n;j++)
       { if(p[j-1]=='X'){R[i][j]=-1;J[i][j]=-1;}
	  else if(p[j-1]=='R'){xr=i;yr=j;}
	   else if(p[j-1]=='J'){xj=i;yj=j;}
	    else if(p[j-1]==' ') R[i][j]=0;
	     else break;
	     }
       }
    prim=new nod;prim=0;ultim=new nod;ultim=0;
    R[xr][yr]=1;
    J[xj][yj]=1;
    pune(xr,yr,1);
    pune(xj,yj,2);
    tmin=1;
    ok=0;
    while(!ok)
    {   tmin++;
	while(prim->cod==1)
	{ xp=prim->x;yp=prim->y;
	  for(i=0;i<=7;i++)
	  { xs=xp+dx[i];ys=prim->y+dy[i];
	    if(R[xs][ys]>=0&&R[xs][ys]<tmin){R[xs][ys]=tmin;pune(xs,ys,1);}
	  }
	  ppp=prim;prim=prim->next;free(ppp);
	}
	while(prim->cod==2)
	{	xp=prim->x;yp=prim->y;
		for(i=0;i<=7;i++)
		{ xs=xp+dx[i];ys=prim->y+dy[i];
		  if(J[xs][ys]>=0&&J[xs][ys]<tmin)
		   { J[xs][ys]=tmin;
		     if(R[xs][ys]==tmin)ok=1;
		     pune(xs,ys,2);
		   }
		}
		ppp=prim;prim=prim->next;free(ppp);
	}
    }
    for(i=1;i<=m;i++)
     for(j=1;j<=n;j++)
      if(R[i][j]==tmin&&J[i][j]==tmin)
       {xsol=i;ysol=j;fprintf(g,"%ld %ld %ld\n",tmin,xsol,ysol);
	fcloseall();return 0;}
    return 0;
}
void pune(long int xx,long int yy,long int cc)
{
	nod *paux;
	paux=new nod;
	paux->x=xx;paux->y=yy;paux->cod=cc;paux->next=0;
	if(!prim)
	{prim=paux;ultim=paux;return;}
	ultim->next=paux;ultim=paux;
}