Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.03 KB | None | 0 0
  1. package puzzle;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.Map;
  8. import java.util.Set;
  9.  
  10. import graphics.DrawingPanel;
  11.  
  12. /**
  13.  * Cette classe implémente la résolution récursive d'un puzzle coulissant NxN
  14.  * en utilisant une recherche arborescente en largeur d'abord.
  15.  *
  16.  * @author François Schumacker
  17.  *
  18.  */
  19. public class PuzzleSolve {
  20.  
  21.     private static final int TAILLE_PUZZLE = 3;
  22.     private static final int TAILLE_CASE = 50; // taille pour l'affichage
  23.     private static final int DELAI_AFFICHAGE = 500; // en millisecondes
  24.  
  25.     /**
  26.      * Cette méthode illustre la résolution d'un puzzle NxN
  27.      *
  28.      * @param args
  29.      */
  30.     public static void main(String[] args) {
  31.         // Création du puzzle
  32.         Puzzle puzzle = new Puzzle(TAILLE_PUZZLE);
  33.         String etatInitial = puzzle.obtenirEtatCourant();
  34.  
  35.         // Création et intialisation du dictionnaire des états atteints
  36.         // => <etat_courant, etat_prédécesseur>
  37.         Map<String, String> etatsAtteints = new HashMap<>();
  38.         etatsAtteints.put(etatInitial, null);
  39.  
  40.         // Création de la fenêtre d'affichage
  41.         DrawingPanel panel = new DrawingPanel(TAILLE_PUZZLE * TAILLE_CASE + 1, TAILLE_PUZZLE * TAILLE_CASE + 1);
  42.         panel.setTitle("Puzzle " + TAILLE_PUZZLE + "x" + TAILLE_PUZZLE);
  43.         afficherPuzzle(panel, etatInitial);
  44.  
  45.         // Recherche d'une solution pour le puzzle
  46.         int nbDeplacements = 0;
  47.         if (!puzzle.estResolu()) { // Pas la peine d'effectuer une recherche !
  48.             // On démarre avec le rang 0 qui contient uniquement l'état initial
  49.             nbDeplacements = resoudrePuzzle(puzzle, 0, etatsAtteints.keySet(), etatsAtteints);
  50.         }
  51.        
  52. //      /*
  53. //       * Décommenter le morceau de code suivant pour pouvoir tester 'animerLaSolution()'
  54. //       * sur un exemple si 'resoudrePuzzle()' ne fonctionne pas.
  55. //       */
  56. //      etatsAtteints.clear();
  57. //      etatsAtteints.put("CABDGE@FH",null);
  58. //      etatsAtteints.put("CABDGEF@H","CABDGE@FH");
  59. //      etatsAtteints.put("CABD@EFGH","CABDGEF@H");
  60. //      etatsAtteints.put("CAB@DEFGH","CABD@EFGH");
  61. //      etatsAtteints.put("@ABCDEFGH","CAB@DEFGH");
  62. //      etatsAtteints.put("CABG@EDFH","CAB@GEDFH");
  63. //      etatsAtteints.put("CAB@GEDFH","CABDGE@FH");
  64. //      etatsAtteints.put("CABDGEFH@","CABDGEF@H");
  65. //      puzzle.definirEtatCourant("@ABCDEFGH");
  66. //      afficherPuzzle(panel, "CABDGE@FH");
  67. //      nbDeplacements = 4;
  68.  
  69.         if (nbDeplacements > 0) {
  70.             // Animation de la solution
  71.             panel.setTitle(nbDeplacements + " déplacement(s)");
  72.             System.out.println("Solution trouvée en " + nbDeplacements + " déplacement(s)!");
  73.             animerLaSolution(panel, puzzle.obtenirEtatCourant(), etatsAtteints);
  74.         } else {
  75.             System.out.println("Pas de solution trouvée");
  76.         }
  77.  
  78.     }
  79.  
  80.     /**
  81.      * Recherche une solution au puzzle à partir des états d'un rang donné.
  82.      *
  83.      * @param puzzle
  84.      *            Puzzle à résoudre
  85.      * @param rang
  86.      *            Numéro du rang courant (= distance par rapport à la racine de
  87.      *            l'arbre)
  88.      * @param rangCourant
  89.      *            Ensemble des états appartenant au rang courant de l'arbre de
  90.      *            recherche
  91.      * @param etatsAtteints
  92.      *            Dictionnaire des états déjà atteints par le processus de
  93.      *            résolution
  94.      * @return -1 si aucune solution n'a été trouvée, ou le numéro de rang de
  95.      *         l'état final
  96.      */
  97.     public static int resoudrePuzzle(Puzzle puzzle, int rang, Set<String> rangCourant, Map<String,String> etatsAtteints) {
  98.         Set<String> etatsSuivant = new HashSet<>();  //contient tous les rangs suivant;
  99.         String etat = null;        
  100.         for(String etatCourant : rangCourant) {
  101.             puzzle.definirEtatCourant(etatCourant);
  102.             for(int i =0 ; i< Puzzle.NB_DIRECTIONS; i++) {
  103.                 if(puzzle.deplacerLeTrou(i)==true) {               
  104.                     etat = puzzle.obtenirEtatCourant();        
  105.                     if (!etatsAtteints.containsKey(etat)) {
  106.                         etatsAtteints.put(etat, etatCourant);
  107.                         if(puzzle.estResolu()) {
  108.                             return rang+1;
  109.                         }else {
  110.                             etatsSuivant.add(etat);
  111.                         }              
  112.                     }  
  113.                      puzzle.annulerDeplacerLeTrou(i);    
  114.                     }
  115.             }
  116.            
  117.         }
  118.         if(etatsSuivant.isEmpty()) {
  119.             return -1;
  120.         }
  121.         return resoudrePuzzle(puzzle, rang +1 , etatsSuivant, etatsAtteints );
  122.          
  123.          
  124.     }
  125.  
  126.     /**
  127.      * Affiche les étapes succesives de la résolution du puzzle.
  128.      * Cette méthode DOIT être programmée de manière récursive !!!
  129.      *
  130.      * @param panel
  131.      *            Référence vers une fenêtre d'affichage
  132.      * @param etatCourant
  133.      *            L'état courant de la solution
  134.      * @param etatsAtteints  
  135.      *            Dictionnaire des états atteints par le processus de résolution
  136.      */
  137.     private static void animerLaSolution(DrawingPanel panel, String etatCourant, Map<String,String> etatsAtteints) {
  138.  
  139.     }
  140.  
  141.     /**
  142.      * Dessine le puzzle dans une fenêtre.
  143.      *
  144.      * @param panel
  145.      *            Référence vers une fenêtre d'affichage
  146.      * @param etat
  147.      *            Etat du puzzle à représenter
  148.      */
  149.     public static void afficherPuzzle(DrawingPanel panel, String etat) {
  150.         Graphics g = panel.getGraphics();
  151.         char[] c = new char[1];
  152.        
  153.         // On efface le contenu de la fenêtre
  154.         g.setColor(Color.BLACK);
  155.         g.fillRect(0, 0, panel.getWidth(), panel.getHeight());
  156.  
  157.         // On dessine les cases du puzzle
  158.         int index = 0;
  159.         for (int ligne = 0; ligne < TAILLE_PUZZLE; ligne++) {
  160.             for (int colonne = 0; colonne < TAILLE_PUZZLE; colonne++) {
  161.                 // On calcule la position du coin supérieur gauche
  162.                 int gauche = (colonne * TAILLE_CASE);
  163.                 int haut = (ligne * TAILLE_CASE);
  164.                
  165.                 // On obtient le caractère à afficher
  166.                 c[0] = etat.charAt(index++);
  167.                
  168.                 // On dessine la case si le caractère est différent de '@'
  169.                 if (c[0] != '@') {
  170.                     g.setColor(c[0]%2==0?Color.WHITE:Color.RED);
  171.                     g.fillRect(gauche + 1, haut + 1, TAILLE_CASE - 2, TAILLE_CASE - 2);
  172.                     g.setColor(Color.BLACK);
  173.                     g.drawChars(c, 0, 1, gauche + TAILLE_CASE / 3, haut + TAILLE_CASE * 2 / 3);
  174.                 }
  175.             }
  176.         }
  177.         // Ralenti l'affichage pour laisser le temps de percevoir l'animation
  178.         try {
  179.             Thread.sleep(DELAI_AFFICHAGE);
  180.         } catch (InterruptedException ex) {
  181.         }
  182.  
  183.     }
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement