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;;