Guest User

Untitled

a guest
May 2nd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 12.84 KB | None | 0 0
  1. WITH Ada.Text_IO, Ada.Integer_Text_IO;
  2. USE Ada.Text_IO, Ada.Integer_Text_IO;
  3.  
  4. PROCEDURE Sudoku IS
  5.  
  6.    --------------------------- ETAPE 1 : DECLARATION DES TYPES ---------------------------
  7.  
  8.    TYPE TCarre IS ARRAY (Integer RANGE 1 .. 9, Integer RANGE 1 .. 9) OF Integer;
  9.    TYPE TPossibles IS ARRAY (Integer RANGE 1 .. 9) OF Boolean;
  10.    TYPE TVectPossibles IS
  11.       RECORD
  12.          Nb   : Integer;
  13.          Vect : Tpossibles;
  14.       END RECORD;
  15.    TYPE TCube IS ARRAY (Integer RANGE 1 .. 9, Integer RANGE 1 .. 9) OF TVectPossibles;
  16.    TYPE TVectCarre IS ARRAY (1 .. 40) OF Tcarre;
  17.    TYPE TVectCoord IS ARRAY (1 .. 40, 1 .. 4) OF Integer;
  18.  
  19.  
  20.    --------------------------- DECLARATION DES VARIABLES ---------------------------
  21.  
  22.    Sudoku  : TvectPossibles;
  23.    Grille,
  24.    Grille2 : TCarre;
  25.    Cube    : TCube;
  26.    X,
  27.    Y,
  28.    Z       : Integer;
  29.  
  30.  
  31.    --------------------------- ETAPE 2 : Procédures et fonctions de base de la grille de jeu ---------------------------
  32.    PROCEDURE Affiche (
  33.          Mat : IN     TCarre) IS
  34.       X : Integer := 0;
  35.    BEGIN
  36.       FOR I IN 1..9 LOOP
  37.          FOR J IN 1..9 LOOP
  38.             X := Mat(I,J);
  39.             Put(X,0);
  40.             Put("  ");
  41.          END LOOP;
  42.          New_Line(2);
  43.       END LOOP;
  44.    END Affiche;
  45.  
  46.    PROCEDURE Recopie (
  47.          Mat  : IN     TCarre;
  48.          Mat2 :    OUT TCarre) IS
  49.    BEGIN
  50.       FOR I IN 1..9 LOOP
  51.          FOR J IN 1..9 LOOP
  52.             Mat2(I,J) := Mat(I,J);
  53.          END LOOP;
  54.       END LOOP;
  55.    END Recopie;
  56.  
  57.    FUNCTION PlusDeCasesNulles (
  58.          Mat : IN     TCarre)
  59.      RETURN Boolean IS
  60.       Flag : Boolean := True;
  61.    BEGIN
  62.       FOR I IN 1..9 LOOP
  63.          FOR J IN 1..9 LOOP
  64.             IF (Mat(I,J) = 0) THEN
  65.                Flag := False;
  66.             END IF;
  67.          END LOOP;
  68.       END LOOP;
  69.       RETURN (Flag);
  70.    END PlusDeCasesNulles;
  71.  
  72.    --------------------------- ETAPE 3 : Existence d'une valeur dans une unité ---------------------------
  73.  
  74.    FUNCTION ExisteDansLigne (
  75.          Mat    : IN     TCarre;
  76.          NumLig : IN     Integer;
  77.          X      : IN     Integer)
  78.      RETURN Boolean IS
  79.       Flag : Boolean := True;
  80.    BEGIN
  81.       FOR I IN 1..9 LOOP
  82.          IF (Mat(I,NumLig) = X) THEN
  83.             Flag := False;
  84.          END IF;
  85.       END LOOP;
  86.       RETURN (Flag);
  87.    END ExisteDansLigne;
  88.  
  89.    FUNCTION ExisteDansColonne (
  90.          Mat    : IN     TCarre;
  91.          NumCol : IN     Integer;
  92.          X      : IN     Integer)
  93.      RETURN Boolean IS
  94.       Flag : Boolean := True;
  95.    BEGIN
  96.       FOR I IN 1..9 LOOP
  97.          IF (Mat(NumCol,I) = X) THEN
  98.             Flag := False;
  99.          END IF;
  100.       END LOOP;
  101.       RETURN (Flag);
  102.    END ExisteDansColonne;
  103.  
  104.    FUNCTION ExisteDansRegion (
  105.          Mat : IN     TCarre;
  106.          X   : IN     Integer;
  107.          K   : IN     Integer;
  108.          L   : IN     Integer)
  109.      RETURN Boolean IS
  110.       Flag : Boolean := False;
  111.       Lig  : Integer := K;
  112.       Col  : Integer := L;
  113.    BEGIN
  114.       Lig := (Lig-1)/3 * 3 ;
  115.       Col := (Col-1)/3 * 3 ;
  116.       FOR I IN 1+Lig .. 3+Lig LOOP
  117.          FOR J IN 1+Col .. 3+Col LOOP
  118.             IF Mat (I,J)= X THEN
  119.                Flag := True;
  120.             END IF;
  121.          END LOOP;
  122.       END LOOP;
  123.       RETURN Flag;
  124.    END ExisteDansRegion;
  125.  
  126.    --------------------------- ETAPE 4 : Gestion des possibles ---------------------------
  127.  
  128.    PROCEDURE InitLesPossibles (
  129.          T : IN OUT TVectPossibles) IS
  130.    BEGIN
  131.       FOR I IN 1..9 LOOP
  132.          T.Vect(I) := False;
  133.       END LOOP;
  134.       T.Nb := 0;
  135.    END InitLesPossibles;
  136.  
  137.    PROCEDURE InitCube (
  138.          Cube : IN     TCube) IS
  139.       X : TVectPossibles;
  140.    BEGIN
  141.       FOR I IN 1..9 LOOP
  142.          FOR J IN 1..9 LOOP
  143.             X := Cube(I,J);
  144.             InitLesPossibles(X);
  145.          END LOOP;
  146.       END LOOP;
  147.    END InitCube;
  148.  
  149.    PROCEDURE ValeursPossiblesDansRegion (
  150.          Grille : IN     TCarre;
  151.          K,
  152.          L      : IN     Integer;
  153.          Cub    : IN OUT TCube) IS
  154.       -- Pré-requis : K et L doivent être égaux à 1, 4 ou 7
  155.       N : Integer := 0;
  156.    BEGIN
  157.       FOR I IN K..K+2 LOOP
  158.          FOR J IN L..L+2 LOOP
  159.             N := 0;
  160.             InitLesPossibles(Cub(I,J));
  161.             IF Grille(I,J) = 0 THEN
  162.                FOR X IN 1..9 LOOP
  163.                   IF ExisteDansLigne(Grille, I, X) = False THEN
  164.                      IF ExisteDansColonne(Grille, J, X) = False THEN
  165.                         IF ExisteDansRegion(Grille, K, L, X) = False THEN
  166.                            Cub(I,J).Vect(X) := True;
  167.                            Cub(I,J).Nb := N + 1;
  168.                         END IF;
  169.                      END IF;
  170.                   END IF;
  171.                END LOOP;
  172.             END IF;
  173.          END LOOP;
  174.       END LOOP;
  175.    END ValeursPossiblesDansRegion;
  176.  
  177.    PROCEDURE ValeursPossiblesJeu (
  178.          Grille : IN     TCarre;
  179.          Cube   : IN OUT TCube) IS
  180.    BEGIN
  181.       FOR I IN 1..9 LOOP
  182.          FOR J IN 1..9 LOOP
  183.             ValeursPossiblesDansRegion(Grille,I,J,Cube);
  184.          END LOOP;
  185.       END LOOP;
  186.    END ValeursPossiblesJeu;
  187.  
  188.    FUNCTION SeulPossibleDansLigne (
  189.          Cub    : IN     TCube;
  190.          Lig,
  191.          Valeur : IN     Integer)
  192.      RETURN Boolean IS
  193.       -- si dans valeur possible y'a qu'une seule valeur juste alors flag = true
  194.       Stock : Integer := 0;
  195.    BEGIN
  196.       FOR I IN 1..9 LOOP
  197.          IF (Cub(Lig,I).Vect(Valeur)) THEN
  198.             Stock := Stock + 1;
  199.          END IF;
  200.       END LOOP;
  201.       RETURN(Stock = 1);
  202.    END SeulPossibleDansLigne;
  203.  
  204.    FUNCTION SeulPossibleDansColonne (
  205.          Cub    : IN     TCube;
  206.          Col,
  207.          Valeur : IN     Integer)
  208.      RETURN Boolean IS
  209.       Stock : Integer := 0;
  210.    BEGIN
  211.       FOR I IN 1..9 LOOP
  212.          IF (Cub(I,Col).Vect(Valeur)) THEN
  213.             Stock := Stock + 1;
  214.          END IF;
  215.       END LOOP;
  216.       RETURN(Stock = 1);
  217.    END SeulPossibleDansColonne;
  218.  
  219.    FUNCTION SeulPossibleDansRegion (
  220.          Cub    : IN     TCube;
  221.          Lig,
  222.          Col,
  223.          Valeur : IN     Integer)
  224.      RETURN Boolean IS
  225.       L     : Integer := Lig;
  226.       K     : Integer := Col;
  227.       Stock : Integer := 0;
  228.  
  229.    BEGIN
  230.       L := (Lig-1)/3 * 3 ;
  231.       K := (Col-1)/3 * 3 ;
  232.       FOR I IN 1+Lig .. 3+Lig LOOP
  233.          FOR J IN 1+Col .. 3+Col LOOP
  234.             IF (Cub(I,J).Vect(Valeur)) THEN
  235.                Stock := Stock + 1;
  236.             END IF;
  237.          END LOOP;
  238.       END LOOP;
  239.       RETURN (Stock = 1);
  240.    END SeulPossibleDansRegion;
  241.  
  242.    --------------------------- ETAPE 5 : Jeu ---------------------------
  243.  
  244.    FUNCTION CandidatUnique (
  245.          Lig,
  246.          Col,
  247.          Valeur : Integer;
  248.          Cub    : TCube)
  249.      RETURN Boolean IS
  250.    BEGIN
  251.       IF SeulPossibleDansLigne(Cub,Lig,Valeur) OR SeulPossibleDansColonne(
  252.             Cub,Col,Valeur) OR SeulPossibleDansRegion(Cub,Lig,Col,Valeur) THEN
  253.          RETURN(True);
  254.       ELSE
  255.          RETURN(False);
  256.       END IF;
  257.    END CandidatUnique;
  258.  
  259.    PROCEDURE VARIATION_COORD (
  260.          Num : IN     Integer;
  261.          K1,
  262.          K2  :    OUT Integer) IS
  263.    BEGIN
  264.       IF (Num mod 3 = 1) THEN
  265.          K1 := 1;
  266.          K2 := 2;
  267.       ELSIF (Num mod 3 = 2) THEN
  268.          K1 := -1;
  269.          K2 := 1;
  270.       ELSE
  271.          K1 := -1;
  272.          K2 := -2;
  273.       END IF;
  274.    END VARIATION_COORD;
  275.  
  276.    FUNCTION PositionUnique (
  277.          Mat_Carre : IN     TCarre;
  278.          Lig,
  279.          Col,
  280.          Val       : IN     Integer)
  281.      RETURN Boolean IS
  282.       X1,
  283.       X2,
  284.       Lig1,
  285.       Lig2,
  286.       Col1,
  287.       Col2 : Integer;
  288.    BEGIN
  289.       Variation_Coord(Lig,X1,X2);
  290.       Lig1 := Lig + X1;
  291.       Lig2 := Lig + X2;
  292.  
  293.       Variation_Coord(Col,X1,X2);
  294.       Col1 := Col + X1;
  295.       Col2 := Col + X2;
  296.  
  297.       RETURN ((ExisteDansLigne(Mat_Carre, Lig1, Val) AND ExisteDansLigne(
  298.                Mat_Carre, Lig2, Val) AND ExisteDansColonne(Mat_Carre, Col1,
  299.                Val) AND ExisteDansColonne(Mat_Carre, Col2, Val))
  300.          OR  (ExisteDansLigne(Mat_Carre, Lig1, Val) AND ExisteDansLigne(
  301.                Mat_Carre, Lig2, Val) AND Mat_Carre(Lig,Col1) /= 0 AND
  302.             Mat_Carre(Lig,Col2) /= 0 )
  303.          OR  (ExisteDansColonne(Mat_Carre, Col1, Val) AND
  304.             ExisteDansColonne(Mat_Carre, Col2, Val) AND Mat_Carre(Lig1,
  305.                Col ) /= 0 AND  Mat_Carre(Lig2,Col) /=0 ));
  306.    END;
  307.  
  308.    --------------------------- PARTIE II Etape 2 ------------------------------
  309.    PROCEDURE PROPOSE (
  310.          C     : IN OUT TCarre;
  311.          Cub   : IN     TCube;
  312.          Lig,
  313.          Col,
  314.          Val   :    OUT Integer;
  315.          Stop1 : IN OUT Boolean) IS
  316.       I,
  317.       J,
  318.       K     : Integer := 1;
  319.       Flag,
  320.       Flag2 : Boolean := False;
  321.    BEGIN
  322.       WHILE Flag=False AND (I/=10) LOOP
  323.          IF C(I,J)=0 THEN
  324.             Lig:=I;
  325.             Col:=J;
  326.             Flag:=True;
  327.             WHILE Flag2=False LOOP
  328.                IF Cub(I,J).Vect(K) THEN
  329.                   Val:=K;
  330.                   Flag2:=True;
  331.                ELSE
  332.                   K:=K+1;
  333.                END IF;
  334.             END LOOP;
  335.             Stop1:=True;
  336.             C(I,J):=Val;
  337.          ELSE
  338.             J:=J+1;
  339.             IF J=10 THEN
  340.                I:=I+1;
  341.                J:=1;
  342.             END IF;
  343.          END IF;
  344.       END LOOP;
  345.    END PROPOSE;
  346.  
  347.    PROCEDURE PROPOSE2 (
  348.       C   : IN OUT TCarre;
  349.       Cub : IN     TCube;
  350.       Lig,
  351.       Col : IN     Integer;
  352.          Val : IN OUT Integer) IS  
  353.       Flag:Boolean:=False;
  354.       K:Integer :=Val+1;
  355.    BEGIN
  356.       WHILE Flag=False OR K<10 LOOP
  357.          IF Cub(Lig,Col).Vect(K) THEN
  358.             Val:=K;
  359.             Flag:=True;
  360.          END IF;
  361.          K:=K+1;
  362.       END LOOP;
  363.    END PROPOSE2;
  364.  
  365.    
  366.    FUNCTION IL_EXISTE_CASE_SANS_CANDIDAT (C : IN TCarre; Cube : IN TCube) RETURN Boolean IS
  367.       I,J : Integer := 1;
  368.       Flag : Boolean := False;
  369.    BEGIN
  370.       WHILE (I >= 9) OR (Flag = False) LOOP
  371.          WHILE (J >= 9) OR (Flag = False) LOOP
  372.             IF (C(I,J) = 0) THEN
  373.                Flag := True;
  374.             END IF;
  375.             J := J+1;
  376.          END LOOP;
  377.          I := I+1;
  378.       END LOOP;
  379.          RETURN(Cube(I,J).Nb = 0);
  380.    END IL_EXISTE_CASE_SANS_CANDIDAT;      
  381.    
  382.    --------------------------- PARTIE II Etape 3 ------------------------------
  383.    
  384.  
  385.  
  386.    
  387.      
  388.    --------------------------- PROCEDURE PRINCIPALE ---------------------------
  389.  
  390.  
  391. BEGIN
  392.    -- Initialisation matrice
  393. --   Grille := ((0,0,0,0,4,0,5,0,0),(0,5,0,0,0,0,6,0,3),(6,0,1,5,0,0,0,0,0),
  394. --      (0,0,0,1,9,0,0,6,0),(0,7,0,0,0,0,0,4,0),(0,8,0,0,6,2,0,0,0),
  395. --      (0,0,0,0,0,8,4,0,9),(4,0,7,0,0,0,0,8,0),(0,0,3,0,2,0,0,0,0));
  396.  
  397.    Grille := ((0,0,4,0,6,1,5,7,8),(5,6,3,8,0,7,0,0,9),(1,0,8,2,0,9,0,0,6),
  398.    (0,1,2,9,8,0,0,5,0),(8,3,7,0,2,0,9,4,1),(0,9,0,0,7,3,8,6,0),
  399.    (7,0,0,4,0,2,3,0,5),(2,0,0,7,0,8,6,9,4),(3,4,9,5,1,0,2,0,0));
  400.  
  401.    -- EXEMPLES DE GRILLES:
  402.  
  403.    --Grille := ((6,5,3,1,0,9,2,0,0),(0,7,0,4,6,3,1,0,9),(1,0,0,0,5,0,6,8,3),
  404.    --(0,9,5,6,0,4,0,0,2),(3,2,4,0,7,0,8,6,1),(7,0,0,3,0,8,4,9,0),
  405.    --(5,3,1,0,4,0,0,0,8),(4,0,2,5,9,7,0,1,0),(0,0,7,8,0,1,5,2,4));
  406.  
  407.    --Grille := ((0,0,0,0,4,0,5,0,0),(0,5,0,0,0,0,6,0,3),(6,0,1,5,0,0,0,0,0),
  408.    --(0,0,0,1,9,0,0,6,0),(0,7,0,0,0,0,0,4,0),(0,8,0,0,6,2,0,0,0),
  409.    --(0,0,0,0,0,8,4,0,9),(4,0,7,0,0,0,0,8,0),(0,0,3,0,2,0,0,0,0));
  410.    
  411.    Put("Bienvenue");
  412.    New_Line(2);
  413.    Affiche(Grille);
  414.    Recopie(Grille,Grille2);
  415.    InitCube(Cube);
  416.    WHILE(NOT(Plusdecasesnulles(Grille2))) LOOP
  417.       FOR I IN 1..9 LOOP
  418.          FOR J IN 1..9 LOOP
  419.             Put ("Ligne ?");
  420.             Get(X);
  421.             Put ("Colonne ?");
  422.             Get(Y);
  423.             IF X<0 OR X>9 OR Y<0 OR Y>9 THEN
  424.                Put ("Case invalide");
  425.                New_Line;
  426.             ELSE
  427.                Put ("Chiffre ?");
  428.                Get(Z);
  429.                New_Line(3);
  430.                IF Z<0 OR Z>9 THEN
  431.                   Put("Chiffre invalide");
  432.                   New_Line;
  433.                END IF;
  434.                IF ((ExisteDansLigne(Grille,X,Z)) OR (ExisteDansColonne(Grille,X,Z)) OR (ExisteDansRegion(Grille,X,Y,Z))) THEN
  435.                      IF (ExisteDansLigne(Grille,X,Z)) THEN
  436.                      Put("Valeur impossible car est present dans la ligne");
  437.                      new_line;
  438.                      END IF;
  439.                      IF (ExisteDansColonne(Grille,X,Z)) THEN
  440.                      Put("Valeur impossible car est present dans la colonne");
  441.                      new_line;
  442.                      END IF;
  443.                      IF (ExisteDansRegion(Grille,X,Y,Z)) THEN
  444.                      Put("Valeur impossible car est present dans la region");
  445.                      new_line;
  446.                      END IF;
  447.                      ELSE
  448.                   Grille2(X,Y):=Z;
  449.                   Affiche(Grille2);
  450.                END IF;
  451.             END IF;
  452.          END LOOP;
  453.       END LOOP;
  454.    END LOOP;
  455.  
  456. END Sudoku;
Add Comment
Please, Sign In to add comment