Advertisement
Guest User

MAZAKI - GENERATOR / SOLVER SUDOKU

a guest
Mar 5th, 2013
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.06 KB | None | 0 0
  1. <?php
  2.  
  3. function retour_rangee($rangee){
  4.     return floor($rangee / 9);
  5. }
  6.  
  7. function retour_colonne($rangee){
  8.     return $rangee % 9;
  9. }
  10.  
  11. function retour_block($rangee){
  12.     return floor(retour_rangee($rangee)/3)*3+floor(retour_colonne($rangee)/3);
  13. }
  14.  
  15. function ligne_possible($nombre,$rangees,$sudoku){
  16.     $possible = true;
  17.     for($i=0;$i<=8;$i++){      
  18.         if($sudoku[$rangees*9+$i] == $nombre){
  19.             $possible = false;
  20.         }      
  21.     }
  22.     return $possible;
  23. }
  24.  
  25. function colonne_possible($nombre,$colonnes,$sudoku){
  26.     $possible = true;
  27.     for($i=0;$i<=8;$i++){
  28.         if($sudoku[$colonnes+9*$i] == $nombre){
  29.             $possible = false;
  30.         }
  31.     }
  32.     return $possible;
  33. }
  34.  
  35. function block_possible($nombre,$block,$sudoku){
  36.     $possible = true;
  37.     for($i=0;$i<=8;$i++){
  38.         if($sudoku[floor($block/3)*27+$i%3+9*floor($i/3)+3*($block%3)] == $nombre){
  39.             $possible = false;
  40.         }
  41.     }
  42.     return $possible;
  43. }
  44.  
  45. function nombre_possible($rangee,$nombre,$sudoku){
  46.     $rangees = retour_rangee($rangee);
  47.     $colonnes = retour_colonne($rangee);
  48.     $block = retour_block($rangee);
  49.     return ligne_possible($nombre,$rangees,$sudoku) && colonne_possible($nombre,$colonnes,$sudoku) && block_possible($nombre,$block,$sudoku);
  50. }  
  51.  
  52. function rangee_correcte($rangees,$sudoku){
  53.     for($i=0;$i<=8;$i++){
  54.         $rangees_temp[$i] = $sudoku[$rangees*9+$i];
  55.     }
  56.     return count(array_diff(array(1,2,3,4,5,6,7,8,9),$rangees_temp)) == 0;
  57. }
  58.  
  59.    
  60.  
  61. function colonne_correcte($colonnes,$sudoku){
  62.     for($i=0;$i<=8;$i++){
  63.         $colonnes_temp[$i] = $sudoku[$colonnes+$i*9];
  64.     }
  65.     return count(array_diff(array(1,2,3,4,5,6,7,8,9),$colonnes_temp)) == 0;
  66. }
  67.  
  68. function block_correct($block,$sudoku){
  69.     for($i=0;$i<=8;$i++){
  70.         $block_temp[$i] = $sudoku[floor($block/3)*27+$i%3+9*floor($i/3)+3*($block%3)];
  71.     }
  72.     return count(array_diff(array(1,2,3,4,5,6,7,8,9),$block_temp)) == 0;
  73. }
  74.  
  75. function jeu_resolu($sudoku){
  76.     for($i=0;$i<=8;$i++){
  77.         if(!block_correct($i,$sudoku) or !rangee_correcte($i,$sudoku) or !colonne_correcte($i,$sudoku)){
  78.             return false;
  79.             break;
  80.         }
  81.     }
  82.     return true;
  83. }
  84.  
  85. function valeurs_possible($rangee,$sudoku){
  86.     $possible = array();
  87.     for($i=1;$i<=9;$i++){
  88.         if(nombre_possible($rangee,$i,$sudoku)){
  89.             array_unshift($possible,$i);
  90.         }
  91.     }
  92.     return $possible;
  93. }
  94.  
  95. function valeurs_aleatoire_possible($possible,$rangee){
  96.     return $possible[$rangee][rand(0,count($possible[$rangee])-1)];
  97. }
  98.  
  99. function scan_jeu($sudoku){
  100.     for($i=0;$i<=80;$i++){
  101.         if($sudoku[$i] == 0){
  102.             $possible[$i] = valeurs_possible($i,$sudoku);
  103.             if(count($possible[$i])==0){
  104.                 return(false);
  105.                 break;
  106.             }
  107.         }
  108.     }
  109.     return($possible);
  110. }
  111.  
  112. function annuler_tentative($tentative_tbl,$nombre){
  113.     $nouveau_tableau = array();
  114.     for($i=0;$i<count($tentative_tbl);$i++){
  115.         if($tentative_tbl[$i] != $nombre){
  116.             array_unshift($nouveau_tableau,$tentative_tbl[$i]);
  117.         }
  118.     }
  119.     return $nouveau_tableau;
  120. }
  121.        
  122.  
  123. function suivant_aleatoire($possible){
  124.     $max = 9;
  125.     for($i=0;$i<=80;$i++){
  126.         if ((count($possible[$i])<=$max) && (count($possible[$i])>0)){
  127.             $max = count($possible[$i]);
  128.             $choix_mini = $i;
  129.         }
  130.     }
  131.     return $choix_mini;
  132. }
  133.  
  134.     $sauvee = array();    
  135.     $sauvee_sud = array();
  136.     while(!jeu_resolu($sudoku)){
  137.         $i += 1;
  138.         $etape_suiv = scan_jeu($sudoku);
  139.         if($etape_suiv == false){
  140.             $etape_suiv = array_pop($sauvee);
  141.             $sudoku = array_pop($sauvee_sud);
  142.         }
  143.         $essai = suivant_aleatoire($etape_suiv);    
  144.         $tentative = valeurs_aleatoire_possible($etape_suiv,$essai);
  145.         if(count($etape_suiv[$essai]) > 1){                    
  146.             $etape_suiv[$essai] = annuler_tentative($etape_suiv[$essai],$tentative);
  147.             array_push($sauvee,$etape_suiv);
  148.             array_push($sauvee_sud,$sudoku);
  149.         }
  150.         $sudoku[$essai] = $tentative;    
  151.     }
  152.     ?>
  153. <table bgcolor="#000000" cellspacing="1" cellpadding="2">
  154.     <?php
  155.     for($i = 0; $i <= 8; $i++){ ?>
  156. <tr bgcolor="white" align="center">
  157.         <?php
  158.         for($y = 0; $y <= 8; $y++){ ?>
  159. <td width="40" height="40"><?php echo $sudoku[$i * 9 + $y]; ?></td>
  160.         <?php
  161.         }
  162.         ?>
  163. </tr>
  164.     <?php
  165.     }
  166.     ?>
  167. </table>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement