Cod sursa(job #256102)

Utilizator udrescu_cristiUdrescu Cristian udrescu_cristi Data 11 februarie 2009 08:10:15
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<iostream.h>
#include<stdio.h>
FILE *f=fopen("rj.in","r"),*g=fopen("rj.out","w");
int a[100][100],i,j,m,n,d[100][100];
char x;
int lv,cv,k,t=1,xr,yr,xj,yj,dl[10],dc[10];
 void citire()
{
fscanf(f,"%d %d\n",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
x=fgetc(f);
if(x!='\n')
{
if(x=='X')a[i][j]=1;
else
{
if(x==' ')a[i][j]=0;
else
{
if(x=='R')
{
xr=i;
yr=j;
a[i][j]=0;
}
else
{
a[i][j]=0;
xj=i;
yj=j;
}
}
}
}
else j--;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
d[i][j]=0;
}
}
for(i=0;i<=m+1;i++)
{
a[0][i]=-1;
a[n+1][i]=-1;
}
for(j=0;j<=n+1;j++)
{
a[j][0]=-1;
a[j][m+1]=-1;
}
dl[1]=1; dc[1]=0;
dl[2]=0; dc[2]=1;
dl[3]=-1; dc[3]=0;
dl[4]=0; dc[4]=-1;
dl[5]=-1; dc[5]=-1;
dl[6]=1; dc[6]=1;
dl[7]=-1; dc[7]=1;
dl[8]=1; dc[8]=-1;
}
int test(int lv,int cv)
{
int t2=1,lvt,cvt;
for(int x1=1;x1<=8&&t2;x1++)
{
lvt=lv+dl[x1];
cvt=cv+dc[x1];
if(d[lvt][cvt]==d[lv][cv]-1)
{
if((lvt==i-1&&cvt==j)||(lvt==i+1&&cvt==j)) t2=0;
if((lvt==i&&cvt==j-1)||(lvt==i&&cvt==j+1)) t2=0;
}
}
if(t2) return 1;
else return 0;
}
 void calcul(int a[100][100],int m,int n)
{
k=1;
d[xr][yr]=k;
d[xj][yj]=k;
do
{
int t1=1;
t=0;
for(i=1;i<=n&&t1;i++)
for(j=1;j<=m&&t1;j++)
{
if(d[i][j]==k)
{
for(x=1;x<=8&&t1;x++)
{
lv=i+dl[x];
cv=j+dc[x];
if(d[lv][cv]==k+1)
{
if(test(lv,cv))
{
fprintf(g,"%d %d %d",d[lv][cv],lv,cv);
t1=0;
t=0;
}
}
else
{
if(d[lv][cv]==0&&a[lv][cv]==0)
{
d[lv][cv]=k+1;
t=1;
}
}
}
}
}
if(t) k++;
}
while(t);
}
 int main()
{
citire();
calcul(a,m,n);
return 0;
}