Mercredi 30 mai 2007 3 30 /05 /Mai /2007 13:18
bienvenue sur mon blog.si tu t'intéresses à la déferlente sudoku et que tu possèdes le logiciel maple 7 viens voir dans mes documents:il y a un worksheet nommé sudoku que j'ai crée,c'est un résolveur de sudoku. 
voici le code:

f1:=proc(l0,n);l:=l0;for i from 1 to nops(l) do A:=[];for j from 1 to nops(l[i]) do if l[i][j][1]<>`` then A:=[op(A),l[i][j][1]] fi od;d:=sousta([seq(i,i=1..n)],A);for ki from 1 to nops(d) do for j from 1 to nops(l[i]) do if l[i][j][1]=`` and not(member(d[ki],[seq(l[i][j][1],i=1..nops(l))])) then l:=[seq(l[x],x=1..(i-1)),[seq(l[i][t],t=1..j-1),[l[i][j][1],[op(l[i][j][2]),d[ki]]],seq(l[i][t],t=j+1..nops(l[i]))],seq(l[x],x=(i+1)..nops(l))];fi;od;od;od;return(l);end;
f2:=proc(l0);l:=l0;d:=[[1,1],[1,4],[1,7],[4,1],[4,4],[4,7],[7,1],[7,4],[7,7]];for ki from 1 to nops(d) do A:=[];for i from d[ki][1] to d[ki][1]+2 do for j from d[ki][2] to d[ki][2]+2 do if l[i][j][1]<>`` then A:=[op(A),l[i][j][1]];fi od;od;for ti from 1 to nops(A) do    for xi from d[ki][1] to d[ki][1]+2 do for yi from d[ki][2] to d[ki][2]+2 do l:=[seq(l[x],x=1..(xi-1)),[seq(l[xi][t],t=1..yi-1),[l[xi][yi][1],sousta(l[xi][yi][2],[A[ti]])],seq(l[xi][t],t=yi+1..nops(l[xi]))],seq(l[x],x=(xi+1)..nops(l))]; od;od;od;od;return(l);end;
f3 := proc (l0) local l, d, te, i, j, r, ki, xi, yi; l := l0; d := [[1, 1], [1, 4], [1, 7], [4, 1], [4, 4], [4, 7], [7, 1], [7, 4], [7, 7]]; for i to 9 do for j to nops(l[1]) do if nops(l[i][j][2]) = 1 then l := [seq(l[x],x = 1 .. i-1), [seq(l[i][t],t = 1 .. j-1), [op(l[i][j][2]), []], seq(l[i][t],t = j+1 .. nops(l[i]))], seq(l[x],x = i+1 .. nops(l))]; r := 0; for ki to nops(d) do if d[ki][1] <= i and i <= d[ki][1]+2 and d[ki][2] <= j and j <= d[ki][2]+2 then r := ki; break end if end do; for xi from d[r][1] to d[r][1]+2 do for yi from d[r][2] to d[r][2]+2 do l := [seq(l[x],x = 1 .. xi-1), [seq(l[xi][t],t = 1 .. yi-1), [l[xi][yi][1], sousta(l[xi][yi][2],[l[i][j][1]])], seq(l[xi][t],t = yi+1 .. nops(l[xi]))], seq(l[x],x = xi+1 .. nops(l))] end do end do; l := [seq(l[x],x = 1 .. i-1), [seq([l[i][kj][1], sousta(l[i][kj][2],[l[i][j][1]])],kj = 1 .. j-1), l[i][j], seq([l[i][kj][1], sousta(l[i][kj][2],[l[i][j][1]])],kj = j+1 .. nops(l[i]))], seq(l[x],x = i+1 .. nops(l))]; l := [seq([seq(l[x][kj],kj = 1 .. j-1), [l[x][j][1], sousta(l[x][j][2],[l[i][j][1]])], seq(l[x][kj],kj = j+1 .. nops(l[i]))],x = 1 .. i-1), l[i], seq([seq(l[x][kj],kj = 1 .. j-1), [l[x][j][1], sousta(l[x][j][2],[l[i][j][1]])], seq(l[x][kj],kj = j+1 .. nops(l[i]))],x = i+1 .. nops(l))]; break end if end do end do;te:=0; while(te=0) do dd:=l;l := f4(l); for i to 9 do for j to nops(l[1]) do if nops(l[i][j][2]) = 1 then l := [seq(l[x],x = 1 .. i-1), [seq(l[i][t],t = 1 .. j-1), [op(l[i][j][2]), []], seq(l[i][t],t = j+1 .. nops(l[i]))], seq(l[x],x = i+1 .. nops(l))]; r := 0; for ki to nops(d) do if d[ki][1] <= i and i <= d[ki][1]+2 and d[ki][2] <= j and j <= d[ki][2]+2 then r := ki; break end if end do; for xi from d[r][1] to d[r][1]+2 do for yi from d[r][2] to d[r][2]+2 do l := [seq(l[x],x = 1 .. xi-1), [seq(l[xi][t],t = 1 .. yi-1), [l[xi][yi][1], sousta(l[xi][yi][2],[l[i][j][1]])], seq(l[xi][t],t = yi+1 .. nops(l[xi]))], seq(l[x],x = xi+1 .. nops(l))] end do end do; l := [seq(l[x],x = 1 .. i-1), [seq([l[i][kj][1], sousta(l[i][kj][2],[l[i][j][1]])],kj = 1 .. j-1), l[i][j], seq([l[i][kj][1], sousta(l[i][kj][2],[l[i][j][1]])],kj = j+1 .. nops(l[i]))], seq(l[x],x = i+1 .. nops(l))]; l := [seq([seq(l[x][kj],kj = 1 .. j-1), [l[x][j][1], sousta(l[x][j][2],[l[i][j][1]])], seq(l[x][kj],kj = j+1 .. nops(l[i]))],x = 1 .. i-1), l[i], seq([seq(l[x][kj],kj = 1 .. j-1), [l[x][j][1], sousta(l[x][j][2],[l[i][j][1]])], seq(l[x][kj],kj = j+1 .. nops(l[i]))],x = i+1 .. nops(l))]; break end if end do end do; l := f5(l); for i to 9 do for j to nops(l[1]) do if nops(l[i][j][2]) = 1 then l := [seq(l[x],x = 1 .. i-1), [seq(l[i][t],t = 1 .. j-1), [op(l[i][j][2]), []], seq(l[i][t],t = j+1 .. nops(l[i]))], seq(l[x],x = i+1 .. nops(l))]; r := 0; for ki to nops(d) do if d[ki][1] <= i and i <= d[ki][1]+2 and d[ki][2] <= j and j <= d[ki][2]+2 then r := ki; break end if end do; for xi from d[r][1] to d[r][1]+2 do for yi from d[r][2] to d[r][2]+2 do l := [seq(l[x],x = 1 .. xi-1), [seq(l[xi][t],t = 1 .. yi-1), [l[xi][yi][1], sousta(l[xi][yi][2],[l[i][j][1]])], seq(l[xi][t],t = yi+1 .. nops(l[xi]))], seq(l[x],x = xi+1 .. nops(l))] end do end do; l := [seq(l[x],x = 1 .. i-1), [seq([l[i][kj][1], sousta(l[i][kj][2],[l[i][j][1]])],kj = 1 .. j-1), l[i][j], seq([l[i][kj][1], sousta(l[i][kj][2],[l[i][j][1]])],kj = j+1 .. nops(l[i]))], seq(l[x],x = i+1 .. nops(l))]; l := [seq([seq(l[x][kj],kj = 1 .. j-1), [l[x][j][1], sousta(l[x][j][2],[l[i][j][1]])], seq(l[x][kj],kj = j+1 .. nops(l[i]))],x = 1 .. i-1), l[i], seq([seq(l[x][kj],kj = 1 .. j-1), [l[x][j][1], sousta(l[x][j][2],[l[i][j][1]])], seq(l[x][kj],kj = j+1 .. nops(l[i]))],x = i+1 .. nops(l))]; break end if end do end do ;if l=dd then te:=1;fi;end do; return l end proc;
suivant:=c->if c[2]=9 then [c[1]+1,1] else [c[1],c[2]+1] fi;al:=(i,l,c)->if i=l then c else 1 fi;
sudoku:=proc(l0);d:=[[[1,1],[1,4],[1,7]],[[4,1],[4,4],[4,7]],[[7,1],[7,4],[7,7]]];l:=[seq([seq([l0[i][j],[]],j=1..nops(l0[1]))],i=1..nops(l0))];   z:=f3(f2(f1(l,9)));rz1:=0; for ki from 1 to nops(z) do for kj from 1 to nops(z[1]) do if z[ki][kj][1]=`` then rz1:=1;break;fi;od;od;if rz1=1 then Co:=[[z,[1,1]]];e:=0;CC:=[];while(e=0) do for t from 1 to nops(Co) do if e=0 then  C:=Co[t];for i from C[2][1] to nops(C[1]) do if e=0 then for j from al(i,C[2][1],C[2][2]) to nops(C[1][1]) do if e=0 then if nops(C[1][i][j][2])>=2 then  Ca:=[seq([f3((([seq(C[1][x],x=1..(i-1)),[seq(C[1][i][y],y=1..(j-1)),[``,[C[1][i][j][2][k]]],seq(C[1][i][y],y=j+1..nops(C[1][i]))],seq(C[1][x],x=(i+1)..nops(C[1]))]))),suivant([i,j])],k=1..nops(C[1][i][j][2]))];err:=[seq(1,k=1..nops(Ca))]; for k from 1 to nops(Ca) do rz:=0; for ki from 1 to nops(Ca[k][1]) do for kj from 1 to nops(Ca[k][1][1]) do if Ca[k][1][ki][kj][1]=`` then rz:=1;break;fi;od;od;err:=[seq(err[ui],ui=1..k-1),rz,seq(err[ui],ui=k+1..nops(err))];od;for ti from 1 to nops(err) do if err[ti]=0 then z:=Ca[ti][1];e:=1;break;else CC:=[op(CC),Ca[ti]];fi;od;fi;else break;fi;od;else break;fi;od;else break;fi;od;Co:=CC;CC:=[];od;fi;za:=[seq([seq(z[i][j][1],j=1..nops(z[1]))],i=1..nops(z))];B:=[];for ki from 1 to nops(d) do A:=[];for x from 1 to nops(d[ki]) do s:=[seq([seq(za[i][j],j=d[ki][x][2]..d[ki][x][2]+2)],i=d[ki][x][1]..d[ki][x][1]+2)];A:=[op(A),matrix(s)];od;B:=[op(B),A];od;return(matrix(B));end;
sousta:=proc(l,d);A:=[];for i from 1 to nops(l) do r:=0;for j from 1 to nops(d) do if l[i]=d[j] then r:=1;fi;od;if r=0 then A:=[op(A),l[i]] fi od;return(A);end;
f4:=proc(l0);l:=l0;d:=[[1,1],[1,4],[1,7],[4,1],[4,4],[4,7],[7,1],[7,4],[7,7]];for i from 1 to nops(l) do for j from 1 to nops(l[1]) do if nops(l[i][j][2])=2 then r:=0;for ki from 1 to nops(d) do if   (i>=d[ki][1] and i<=d[ki][1]+2 and j>=d[ki][2] and j<=d[ki][2]+2) then r:=ki;break;fi;od;for xi from d[r][1] to d[r][1]+2 do for yi from d[r][2] to d[r][2]+2 do if l[xi][yi][2]=l[i][j][2] and [xi,yi]<>[i,j] then for zi from d[r][1] to d[r][1]+2 do for ti from d[r][2] to d[r][2]+2 do if not(member([zi,ti],[[i,j],[xi,yi]])) then l:=[seq(l[x],x=1..zi-1),[seq(l[zi][y],y=1..ti-1),[l[zi][ti][1],sousta(l[zi][ti][2],l[i][j][2])],seq(l[zi][y],y=ti+1..nops(l[zi]))],seq(l[x],x=zi+1..nops(l))]; fi;od;od;fi;od;od;for kj from 1 to nops(l[i]) do if l[i][kj][2]=l[i][j][2] and [i,kj]<>[i,j] then for ko from 1 to nops(l[i]) do if not(member([i,ko],[[i,kj],[i,j]])) then l:=[seq(l[x],x=1..i-1),[seq(l[i][t],t=1..ko-1),[l[i][ko][1],sousta(l[i][ko][2],l[i][j][2])],seq(l[i][t],t=ko+1..nops(l[i]))],seq(l[x],x=(i+1)..nops(l))];fi;od;fi;od; for ki from 1 to nops(l) do if l[ki][j][2]=l[i][j][2] and [ki,j]<>[i,j] then for ko from 1 to nops(l) do if not(member([ko,j],[[ki,j],[i,j]])) then l:=[seq(l[x],x=1..ko-1),[seq(l[ko][y],y=1..j-1),[l[ko][j][1],sousta(l[ko][j][2],l[i][j][2])],seq(l[ko][y],y=j+1..nops(l[ko]))],seq(l[x],x=ko+1..nops(l))];fi;od;fi;od;fi;od;od;return(l);end;
f5:=proc(l0);l:=l0;d:=[[1,1],[1,4],[1,7],[4,1],[4,4],[4,7],[7,1],[7,4],[7,7]];for ki from 1 to nops(d) do for n from 1 to 9  do  A:=[];for i from d[ki][1] to d[ki][1]+2 do  for j from d[ki][2] to d[ki][2]+2 do  if member(n,l[i][j][2]) then A:=[op(A),[i,j]];fi;od;od;if nops(A)=1 then l:=[seq(l[x],x=1..A[1][1]-1),[seq(l[A[1][1]][y],y=1..A[1][2]-1),[l[A[1][1]][A[1][2]][1],[n]],seq(l[A[1][1]][y],y=A[1][2]+1..nops(l[1]))],seq(l[x],x=A[1][1]+1..nops(l))];fi;od;od;for n from 1 to 9 do for i from 1 to nops(l) do A:=[]; for j from 1 to nops(l[1]) do if member(n,l[i][j][2]) then A:=[op(A),[i,j]];fi;od;if nops(A)=1 then l:=[seq(l[x],x=1..A[1][1]-1),[seq(l[A[1][1]][y],y=1..A[1][2]-1),[l[A[1][1]][A[1][2]][1],[n]],seq(l[A[1][1]][y],y=A[1][2]+1..nops(l[1]))],seq(l[x],x=A[1][1]+1..nops(l))]; fi;od;od;for n from 1 to 9 do for j from 1 to nops(l[1]) do A:=[]; for i from 1 to nops(l) do if member(n,l[i][j][2]) then A:=[op(A),[i,j]];fi;od;if nops(A)=1 then l:=[seq(l[x],x=1..A[1][1]-1),[seq(l[A[1][1]][y],y=1..A[1][2]-1),[l[A[1][1]][A[1][2]][1],[n]],seq(l[A[1][1]][y],y=A[1][2]+1..nops(l[1]))],seq(l[x],x=A[1][1]+1..nops(l))]; fi;od;od;return(l);end;
trad:=proc(n);tab:=table([`0`=``,`1`=1,`2`=2,`3`=3,`4`=4,`5`=5,`6`=6,`7`=7,`8`=8,`9`=9]);s:=[seq([seq(tab[substring(n,io..io)],io=1+9*(i-1)..9*i)],i=1..9)];return(s);end;
trad2:=proc(n);te:=[];az:=convert(n,base,10);ar:=[seq(0,k=1..81-nops(az)),seq(az[nops(az)-i+1],i=1..nops(az))];for ki from 1 to nops(ar) do if ar[ki]=0 then te:=[op(te),``] else te:=[op(te),ar[ki]];fi;od; s:=[seq([seq(te[io],io=1+9*(i-1)..9*i)],i=1..9)];return(s);end;
SUDOKU:=n->sudoku(trad2(n));
sudoku_resolveur:=proc();printf("tapez 1 si vous voulez inserer votre grille de sudoku sous forme de nombren");printf("tapez 2 si vous vouler l'inserer sous forme de grille:n");o:=op(scanf("%d",o));if o=1 then printf("inserer votre grille sous forme de nombre qui est la succession des lignes de la grille de haut en basn");printf("les cases vides doivent etre representes par des 0 et les cases non vides par le nombre qu'elles contiennent:n");n:=op(scanf("%d",n));elif o=2 then l:=[];printf("inserer la grille de sudokun");printf("les cases vides doivent etre representes sous forme de 0n");for i from 1 to 9 do x:=scanf("%d %d %d %d %d %d %d %d %d",a,b,c,d,e,f,g,h,i);xx:=[];for k from 1 to nops(x) do if x[k]=0 then xx:=[op(xx),``];else xx:=[op(xx),x[k]];fi;od;l:=[op(l),xx];printf("n");od;fi;printf("la grille résolue est:n");if o=1 then SUDOKU(n);elif o=2 then sudoku(l);fi;end;
Par xavier
Ecrire un commentaire - Voir les 0 commentaires
Retour à l'accueil

Présentation

Créer un Blog

Recherche

Articles récents

Calendrier

Mai 2012
L M M J V S D
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
<< < > >>
Créer un blog gratuit sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus