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>
#include<conio.h>
char G[][10]={"%c[37;44m","%c[30;46m"};
int I[]={-25,-23,-14,-10,10,14,23,25};
int C[65][9],A[144];
int B[65],D[65],E[65];
int F[65],J[65],X[65],Y[65];
int Lx[8],Ly[8],Mx[8],My[8];
int Kx[65],Ky[65];
int H[]={0,0,0,19,76,135,196,259};
int N,a,b,c,e,g,i,h,x,y;
void plasmar(){
for(i=65;--i;)
if(e=E[i]) J[e]=i;
for(i=65;--i;J[i]=0)
printf(G[g=i%8?!g:g],27),
gotoxy(X[i],Y[i]),
printf(J[i]?" %2i ":" ",J[i]),
gotoxy(X[i],Y[i]+1),
printf(" %c[0m",27);
for(i=8;i--;)
gotoxy(41,17-2*i),
printf("=%3i",Ly[i]),
gotoxy(4*i+10,19),
printf("="),
gotoxy(4*i+9,20),
printf("%3i\n",Lx[i]);
}
void restar(int f){
E[f]=0;
Mx[x]--;
My[y]--;
Lx[x]-=f;
Ly[y]-=f;
}
void sumar(int f){
E[f]=b;
Mx[x]++;
My[y]++;
Lx[x]+=f;
Ly[y]+=f;
if(kbhit()&&getch()) plasmar();
}
void final(){
gotoxy(23,1);
printf("%i",++N);
sumar(63);
plasmar();
restar(63);
}
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[i+1]=i%8*4+9,
Y[i+1]=17-i/8*2,
Kx[i+1]=i%8,
Ky[i+1]=i/8,
A[e]=++i;
while(e--)
if(i=A[e])
for(B[i]=1,x=8;x--;)
if(c=A[e+I[x]])
if(c!=18) C[i][B[i]++]=c;
for(y=65;--y;)
for(x=B[y];--x>1;)
if(B[e=C[y][x]]>B[i=C[y][x-1]])
C[y][x-1]=e,
C[y][x++]=i,
x+=x<B[y];
x=Kx[b=18];
y=Ky[b];
sumar(64);
b=1;
Inicio:
x=Kx[b];
y=Ky[b];
if(Lx[x]+a<H[Mx[x]]||Ly[y]+a<H[My[y]])
goto Rutina;
if(F[b])
if(h>3){
if(a>61) final();
goto Rutina;
}
else h++;
D[c=b]=B[b];
sumar(++a);
Rutina:
while(D[b=C[c][--D[c]]]);
if(b) goto Inicio;
if(F[c]) h--;
x=Kx[c];
y=Ky[c];
restar(a--);
if(c=E[a]) goto Rutina;
return 0;
}
No hay comentarios
Para ver el proceso hay que pulsar la barra espaciadora.