Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function retour_rangee($rangee){
- return floor($rangee / 9);
- }
- function retour_colonne($rangee){
- return $rangee % 9;
- }
- function retour_block($rangee){
- return floor(retour_rangee($rangee)/3)*3+floor(retour_colonne($rangee)/3);
- }
- function ligne_possible($nombre,$rangees,$sudoku){
- $possible = true;
- for($i=0;$i<=8;$i++){
- if($sudoku[$rangees*9+$i] == $nombre){
- $possible = false;
- }
- }
- return $possible;
- }
- function colonne_possible($nombre,$colonnes,$sudoku){
- $possible = true;
- for($i=0;$i<=8;$i++){
- if($sudoku[$colonnes+9*$i] == $nombre){
- $possible = false;
- }
- }
- return $possible;
- }
- function block_possible($nombre,$block,$sudoku){
- $possible = true;
- for($i=0;$i<=8;$i++){
- if($sudoku[floor($block/3)*27+$i%3+9*floor($i/3)+3*($block%3)] == $nombre){
- $possible = false;
- }
- }
- return $possible;
- }
- function nombre_possible($rangee,$nombre,$sudoku){
- $rangees = retour_rangee($rangee);
- $colonnes = retour_colonne($rangee);
- $block = retour_block($rangee);
- return ligne_possible($nombre,$rangees,$sudoku) && colonne_possible($nombre,$colonnes,$sudoku) && block_possible($nombre,$block,$sudoku);
- }
- function rangee_correcte($rangees,$sudoku){
- for($i=0;$i<=8;$i++){
- $rangees_temp[$i] = $sudoku[$rangees*9+$i];
- }
- return count(array_diff(array(1,2,3,4,5,6,7,8,9),$rangees_temp)) == 0;
- }
- function colonne_correcte($colonnes,$sudoku){
- for($i=0;$i<=8;$i++){
- $colonnes_temp[$i] = $sudoku[$colonnes+$i*9];
- }
- return count(array_diff(array(1,2,3,4,5,6,7,8,9),$colonnes_temp)) == 0;
- }
- function block_correct($block,$sudoku){
- for($i=0;$i<=8;$i++){
- $block_temp[$i] = $sudoku[floor($block/3)*27+$i%3+9*floor($i/3)+3*($block%3)];
- }
- return count(array_diff(array(1,2,3,4,5,6,7,8,9),$block_temp)) == 0;
- }
- function jeu_resolu($sudoku){
- for($i=0;$i<=8;$i++){
- if(!block_correct($i,$sudoku) or !rangee_correcte($i,$sudoku) or !colonne_correcte($i,$sudoku)){
- return false;
- break;
- }
- }
- return true;
- }
- function valeurs_possible($rangee,$sudoku){
- $possible = array();
- for($i=1;$i<=9;$i++){
- if(nombre_possible($rangee,$i,$sudoku)){
- array_unshift($possible,$i);
- }
- }
- return $possible;
- }
- function valeurs_aleatoire_possible($possible,$rangee){
- return $possible[$rangee][rand(0,count($possible[$rangee])-1)];
- }
- function scan_jeu($sudoku){
- for($i=0;$i<=80;$i++){
- if($sudoku[$i] == 0){
- $possible[$i] = valeurs_possible($i,$sudoku);
- if(count($possible[$i])==0){
- return(false);
- break;
- }
- }
- }
- return($possible);
- }
- function annuler_tentative($tentative_tbl,$nombre){
- $nouveau_tableau = array();
- for($i=0;$i<count($tentative_tbl);$i++){
- if($tentative_tbl[$i] != $nombre){
- array_unshift($nouveau_tableau,$tentative_tbl[$i]);
- }
- }
- return $nouveau_tableau;
- }
- function suivant_aleatoire($possible){
- $max = 9;
- for($i=0;$i<=80;$i++){
- if ((count($possible[$i])<=$max) && (count($possible[$i])>0)){
- $max = count($possible[$i]);
- $choix_mini = $i;
- }
- }
- return $choix_mini;
- }
- $sauvee = array();
- $sauvee_sud = array();
- while(!jeu_resolu($sudoku)){
- $i += 1;
- $etape_suiv = scan_jeu($sudoku);
- if($etape_suiv == false){
- $etape_suiv = array_pop($sauvee);
- $sudoku = array_pop($sauvee_sud);
- }
- $essai = suivant_aleatoire($etape_suiv);
- $tentative = valeurs_aleatoire_possible($etape_suiv,$essai);
- if(count($etape_suiv[$essai]) > 1){
- $etape_suiv[$essai] = annuler_tentative($etape_suiv[$essai],$tentative);
- array_push($sauvee,$etape_suiv);
- array_push($sauvee_sud,$sudoku);
- }
- $sudoku[$essai] = $tentative;
- }
- ?>
- <table bgcolor="#000000" cellspacing="1" cellpadding="2">
- <?php
- for($i = 0; $i <= 8; $i++){ ?>
- <tr bgcolor="white" align="center">
- <?php
- for($y = 0; $y <= 8; $y++){ ?>
- <td width="40" height="40"><?php echo $sudoku[$i * 9 + $y]; ?></td>
- <?php
- }
- ?>
- </tr>
- <?php
- }
- ?>
- </table>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement