Problema Salto del Caballo.
C/Visual C
Actualizado el 14 de Octubre del 2023 por Adelino (27 códigos) (Publicado el 3 de Agosto del 2023)
6.713 visualizaciones desde el 3 de Agosto del 2023
Solucion al problema por el metodo de paso atras.


#include<stdio.h>
char G[][12]={"%c[37;44m","%c[30;46m","%c[%i;%if%s"};
char Vx[17]={"2321232321210101"};
char Vy[17]={"2323212323212101"};
int I[]={-25,-23,-14,-10,10,14,23,25};
int B[65],D[65],E[65],F[65],J[65];
int C[65][9],Mx[8][2],My[8][2];
int Lx[8],Ly[8],Kx[65],Ky[65];
int Hx[5][8][2],Hy[5][8][2];
int A[144],X[65],Y[65];
int T,N,a,b,c,e,h,i,n,x,y;
void plasmar(int f){
printf("%c[1;1fmaximo=%i",27,T=T<f?f:T);
if(a>61) printf(" Total=%i",++N);
for(e=65;--e;)
if(E[e]) J[E[e]]=e;
for(n=65;--n;J[n]=0)
printf(G[e=n%8?!e:e],27),
printf(G[2],27,Y[n],X[n]," "),
printf(J[n]?"%2i ":" ",J[n]),
printf(G[2],27,Y[n]+1,X[n]," ");
printf("%c[0m",27);
for(n=8;n--;)
printf(G[2],27,17-2*n,36,"="),
printf("%3i",Ly[n]+f*(y==n)),
printf(G[2],27,19,4*n+5,"="),
printf(G[2],27,20,4*n+4,""),
printf("%3i\n",Lx[n]+f*(x==n));
}
int main(){
F[3]=F[12]=F[28]=F[33]=F[35]=1;
for(y=12;y--;)
for(x=12;x--;e++)
if(y<10&&y>1&&x<10&&x>1)
X[n+1]=n%8*4+4,
Y[n+1]=17-n/8*2,
Kx[n+1]=n%8,
Ky[n+1]=n/8,
A[e]=++n;
while(e--)
if(y=A[e])
for(B[y]=1,x=8;x--;)
if(c=A[e+I[x]])
if(c!=18) C[y][B[y]++]=c;
for(y=65;--y;)
for(x=B[y];--x>1;)
if(B[e=C[y][x]]>B[n=C[y][x-1]])
C[y][x-1]=e,
C[y][x++]=n,
x+=x<B[y];
for(x=8;x--;)
for(n=12,y=4;y--;n-=2)
for(i=2;i--;)
Hx[y][x][i]=Hx[y+1][x][i]+Vx[2*x+i]+n,
Hy[y][x][i]=Hy[y+1][x][i]+Vy[2*x+i]+n;
E[64]=18;
Lx[1]=Ly[2]=64;
Mx[1][0]=My[2][0]=1;
b=i=1;
Inicio:
e=Lx[x=Kx[b]]+a;
n=Hx[Mx[x][i]+1][x][i]+Hx[Mx[x][!i]][x][!i];
if(e>259||e+n<259) goto Rutina;
e=Ly[y=Ky[b]]+a;
n=Hy[My[y][i]+1][y][i]+Hy[My[y][!i]][y][!i];
if(e>259||e+n<259) goto Rutina;
if(F[b])
if(h<4) h++;
else{
if(a>47) plasmar(J[b]=a+1);
goto Rutina;
}
D[b]=B[b];
E[++a]=c=b;
Lx[x]+=a;
Ly[y]+=a;
Mx[x][i]++;
My[y][i]++;
i=!i;
Rutina:
while(D[b=C[c][--D[c]]]);
if(b) goto Inicio;
if(F[c]) h--;
Lx[Kx[c]]-=a;
Ly[Ky[c]]-=a;
Mx[Kx[c]][i=!i]--;
My[Ky[c]][i]--;
E[a--]=0;
if(c=E[a]) goto Rutina;
return 0;
}
No hay comentarios