Pagini recente » Cod sursa (job #1654879) | Cod sursa (job #1792433) | Cod sursa (job #1088879) | Cod sursa (job #1596944) | Cod sursa (job #882392)
Cod sursa(job #882392)
#include <fstream>
using namespace std;
const int dy[]={0,1,0,-1};
const int dx[]={-1,0,1,0};
int xR,yR,xJ,yJ;
int turbofin=7991;
int i,j,l,k;
int mat[102][102];
int cazuri[99*99][2],IGLOBAL=0;
void leeR(int ii,int jj,int c)
{
int kp,a,b;
for(kp=0;kp<4;kp++)
{
a=ii+dx[kp];
b=jj+dy[kp];
{
if((a==xJ)&&(b==yJ)&&c/2+1<turbofin)
{
turbofin=c/2+1;
}
else if(((mat[a][b]==0)||(mat[a][b]>c+1))&&mat[a][b]!=-1)
{
mat[a][b]=c+1;
leeR(a,b,c+1);
}
}
}
}
int JulietJustCheckAround(int ii,int jj,int bh)
{
int kp,a,cs=0,b;
for(kp=0;kp<4;kp++)
{
a=ii+dx[kp];
b=jj+dy[kp];
if(mat[a][b]==bh)
{
cs++;
}
}
if(cs==2)
return 1;
return 0;
}
void leeJ(int ii,int jj,int cac)
{
int kp,a,b;
if(cac<turbofin)
{
for(kp=0;kp<4;kp++)
{
a=ii+dx[kp];
b=jj+dy[kp];
if(((mat[a][b]==0)||(mat[a][b]>cac+1))&&mat[a][b]!=-1)
{
mat[a][b]=cac+1;
leeJ(a,b,cac+1);
}
}
}
}
int main()
{
ifstream g("rj.in");
int kk=0;
char v[101];
g>>k>>l;
for(i=0;i<=k;i++)
{
g.getline(v,l+1);
for(j=1;j<=l;j++)
{
if(kk!=2)
{
if(v[j-1]=='X')mat[i][j]=-1;
else if(v[j-1]==' ')mat[i][j]=0;
else if(v[j-1]=='R')
{
xR=i;
yR=j;
kk++;
}
else if(v[j-1]=='J')
{
xJ=i;
yJ=j;
kk++;
}
}
else
{
if(v[j-1]=='X')mat[i][j]=-1;
else if(v[j-1]==' ')mat[i][j]=0;
}
}
}
//bordizification
for(i=0;i<=(l<k?k:l);i++)
{
mat[i][0]=-1;
mat[i][k+1]=-1;
mat[0][i]=-1;
mat[l+1][i]=-1;
}
leeR(xR,yR,0);
leeJ(xJ,yJ,0);
for(i=1;i<=k;i++)
for(j=1;j<=l;j++)
if(mat[i][j]==turbofin)
if(JulietJustCheckAround(i,j,turbofin-1)==1)
{
cazuri[IGLOBAL][0]=i;
cazuri[IGLOBAL][1]=j;
IGLOBAL++;
}
//In cazul existentei mai multor solutii se va afisa solutia in care linia punctului de intalnire este minima.
//Daca si asa exista mai multe solutii, se va afisa cea in care coloana punctului de intalnire este minima.
if(IGLOBAL>1)
{
mat[0][0]=26267;
mat[0][1]=0;
for(i=0;i<IGLOBAL;i++)
{
if(cazuri[i][0]<mat[0][0])
{
mat[0][0]=cazuri[i][0];
mat[0][1]++;
mat[1][0]=cazuri[i][0];
mat[1][1]=cazuri[i][1];
}
}
if(mat[0][1]>1)
{
mat[0][2]=26267;
for(i=0;i<IGLOBAL;i++)
if(cazuri[i][0]==mat[0][0])
{
if(cazuri[i][1]<mat[0][2])
{
mat[0][2]=cazuri[i][1];
mat[1][0]=cazuri[i][0];
mat[1][1]=cazuri[i][1];
}
}
}
cazuri[0][0]=mat[1][0];
cazuri[0][1]=mat[1][1];
}
ofstream o("rj.out");
o<<turbofin<<" "<<cazuri[0][0]<<" "<<cazuri[0][1];
return 0;
}