on dispose d'un carré 10x10 et il faut placer les chiffres de 1 à 100 dedans, sachant que le mouvements entre deux nombres consécutifs se fait soit en diagonal de 2x2 cases, soit suivant le quadrillage en se déplaçant de 4 cases.
J'ai écrit un algo en CaML et en C pour résoudre ce problème, mais en 12h il ne trouve pas de solution...
Sauriez vous écrire un meilleur algo?
Code C:
#include <stdio.h>
//Tableau des valeurs
int t[10][10];
//Mouvements possibles
int mvt[8][2];
//affiche le tableau
void init_mvt()
{
mvt[0][0] = 2;
mvt[0][1] = 2;
mvt[1][0] = 2;
mvt[1][1] = -2;
mvt[2][0] = -2;
mvt[2][1] = -2;
mvt[3][0] = -2;
mvt[3][1] = 2;
mvt[4][0] = 3;
mvt[4][1] = 0;
mvt[5][0] = -3;
mvt[5][1] = 0;
mvt[6][0] = 0;
mvt[6][1] = 3;
mvt[7][0] = 0;
mvt[7][1] = -3;
}
void aff_tab()
{
int I,J;
for (I=0; I<10; I++)
{
for (J=0; J<10; J++) printf("%2d", t[I][J]);
printf("n")
}
scanf("d",&I);
}
int est_libre(int a, int b)
{
return (a>=0 && b>=0 && a<10 && b<10 && t[a][b] == 0);
}
int get_next(int a,int b,int k)
{
int i,x,y,res;
res=0;
if(k==101) return 1;
for(i=0; i<8 && !res; i++)
{
x = mvt[i][0];
y = mvt[i][1];
if(est_libre(a+x,b+y))
{ t[a+x][b+y] = k;
if(get_next(a+x,b+y,k+1)) {res=1;}
else t[a+x][b+y] = 0;
}
}
return res;
}
int main(int argc, char *argv[])
{
int n,i,j;
for(i=0; i<10; i++) for(j=0; j<10; j++) t[i][j] = 0;
t[0][0] = 1;
init_mvt();
get_next(0,0,2);
aff_tab();
return 0;
}
et le code en CaML:
let libre = 0;; let mvt = [2,2;-2,2;2,-2;-2,-2;0,3;0,-3;3,0;-3,0];; let nouveau n t = let u = make_matrix n n 0 in for i = 0 to n-1 do for j = 0 to n-1 do u.(i) <- t.(i) done; done; u;; let est_libre n t a b = ( a >= 0 && b>= 0 && a < n && b < n && t.(a).(b) = 0 );; let rec get_next n t a b k = if k = n*n+1 then (true,t) else aux t k mvt where rec aux t k = function |[] -> (false,t) |(x,y)::v -> if est_libre n t (a+x) (b+y) then ( t.(a+x).(b+y) <- k; let (res,tab) = get_next n t (a+x) (b+y) (k+1) in if res then (res,tab) else ( t.(a+x).(b+y) <- 0; aux t k v ) ) else aux t k v;; let solve_pb n = let tab0 = make_matrix n n 0 in tab0.(0).(0) <- 1; (get_next n tab0 0 0 2);; solve_pb 10;;

