Cod sursa(job #184283)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 23 aprilie 2008 13:11:43
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <stdio.h>
#define N 103
#define INF 100000000
struct poz{
	int x,y;
};
struct ab{
	int l,d;
};
int n,m,a[N][N];
poz romeo,julieta,sr[N*N],sj[N*N];
ab r[N][N],j[N][N];
const int lin[8]={0,0,1,-1,1,1,-1,-1};
const int col[8]={1,-1,0,0,1,-1,1,-1};
void leer(int x,int y){
	int t;
	for(t=0;t<8;t++)
		if(r[x+lin[t]][y+col[t]].l==-2){
			r[x+lin[t]][y+col[t]].l=r[x][y].l+1;
			sr[++sr[0].x].x=x+lin[t];
			sr[sr[0].x].y=y+col[t];
			if(t>3) r[x+lin[t]][y+col[t]].d++;
		}
}
void leej(int x,int y){
	int t;
	for(t=0;t<8;t++)
		if(j[x+lin[t]][y+col[t]].l==-2){
			j[x+lin[t]][y+col[t]].l=j[x][y].l+1;
			sj[++sj[0].x].x=x+lin[t];
			sj[sj[0].x].y=y+col[t];
			if(t>3) j[x+lin[t]][y+col[t]].d++;
		}
}
int main(){
	int i,p,min=INF,x,y;
	char c;
	freopen("rj.in","r",stdin);
	freopen("rj.out","w",stdout);
	scanf("%d%d\n",&m,&n);
	for (i=1;i<=m;++i)
         for (p=1;p<=n+1;++p){
            scanf("%c",&c);
            if (c=='R'){
               romeo.x=i;
               romeo.y=p;
               r[i][p].l=1;
               j[i][p].l=-2;
			}
            if (c=='J'){
               julieta.x=i;
               julieta.y=p;
               r[i][p].l=-2;
               j[i][p].l=1;
            }
            if (c=='X'){
               r[i][p].l=-1;
               j[i][p].l=-1;
            }
            if (c==' '){
               r[i][p].l=-2;
               j[i][p].l=-2;
            }
		}
	sr[1].x=romeo.x;
	sr[1].y=romeo.y;
	sj[1].x=julieta.x;
	sj[1].y=julieta.y;
	sr[0].x=sj[0].x=1;
	for(i=1;i<=sr[0].x;i++)
		leer(sr[i].x,sr[i].y);
	for(i=1;i<=sj[0].x;i++)
		leej(sj[i].x,sj[i].y);
	for(i=1;i<=m;i++)
		for(p=1;p<=n;p++)
			if(r[i][p].l!=-1 && r[i][p].l!=-2)
				if(r[i][p].l==j[i][p].l){
					if(r[i][p].l<min) {
						min=r[i][p].l;
						x=i;
						y=p;
					}
				}
				else {
					if(r[i][p].l<j[i][p].l && r[i][p].l+r[i][p].d>=j[i][p].l && j[i][p].l<min) {
						min=j[i][p].l; 
						x=i;
						y=p;
					}
					if(r[i][p].l>j[i][p].l && j[i][p].l+j[i][p].d>=r[i][p].l && r[i][p].l<min) {
						min=r[i][p].l; 
						x=i;
						y=p;
					}
				}
	for(i=1;i<=m;i++){
		for(p=1;p<=n;p++)
			printf("%d   ",r[i][p].l);
		printf("\n");
	}
	for(i=1;i<=m;i++){
		for(p=1;p<=n;p++)
			printf("%d   ",j[i][p].l);
		printf("\n");
	}
	printf("%d %d %d\n",min,x,y);
}