public class LabyrintheEnConsole {

  static boolean [][] labyrinthe =
    { { false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false },
      { false,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,false,false,false },
      { false,true ,false,false,true ,false,false,false,false,false,false,false,false,false,true ,false,false,false,false,false },
      { true ,true ,false,false,true ,false,false,false,true ,true ,true ,true ,true ,false,true ,false,false,false,false,false },
      { false,false,false,false,true ,false,false,false,true ,false,false,false,false,false,true ,false,false,false,false,false },
      { false,false,false,false,true ,false,false,true ,true ,true ,true ,false,true ,true ,true ,true ,true ,true ,false,false },
      { false,false,true ,true ,true ,false,false,false,false,false,true ,false,true ,false,false,false,false,true ,false,false },
      { false,false,true ,false,false,false,false,false,false,false,true ,false,true ,false,false,false,false,true ,false,false },
      { false,false,true ,false,false,true ,false,false,false,false,true ,false,false,false,true ,false,false,true ,false,false },
      { false,false,true ,false,false,true ,true ,true ,true ,true ,true ,false,false,false,true ,false,false,true ,false,false },
      { false,false,true ,false,false,false,false,true ,false,false,false,false,false,false,true ,true ,true ,true ,true ,false },
      { false,false,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,false,false,true ,false,false,false,false },
      { false,false,false,false,true ,false,false,true ,false,false,false,false,true ,false,false,true ,true ,true ,false,false },
      { false,true ,false,false,true ,false,false,false,false,false,false,false,true ,false,false,false,false,true ,false,false },
      { false,true ,false,false,false,false,true ,true ,true ,true ,true ,true ,true ,false,false,false,false,false,false,false },
      { false,true ,true ,false,false,false,true ,false,false,false,false,false,false,false,false,false,true ,true ,true ,true  },
      { false,false,true ,false,false,false,true ,false,true ,true ,true ,true ,true ,false,false,false,true ,false,false,false },
      { false,false,true ,false,false,false,true ,false,true ,false,false,false,false,false,false,false,true ,false,false,false },
      { false,false,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,false,false,false },
      { false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false } };

/////////////////////////////////////////////////////////////////////////////////

/* Type structure de definition d'une position    */
/* par un numero de ligne et un numero de colonne */

  static class Position {
    int l = -1;
    int c = -1; };

/* Test d'egalite de deux position                */

  static boolean egal(Position p1,Position p2) {
    boolean res;
    if ( ( p1.c != p2.c ) || ( p1.l != p2.l ) ) {
      res = false; }
      else {
      res = true; }
    return res;
  }

/* Fonction de test de l'existence d'une sortie   */
/* a un labyrinthe represente par un tableau      */
/* de booleen                                     */
/* La matrice lb code le labyrinthe               */
/* Le parametre p est la position a partir        */
/* de laquelle rechercher                         */
/* Le parametre origine est la position qui vient */
/* d'etre quittee pour atteindre la position p et */
/* vers laquelle il est interdit de retourner     */
/* Le parametre sortie est destine a recueillir   */
/* la position de la sortie si celle-ci existe    */
/* Le booleen retourne indique si une sortie      */
/* a ete trouvee                                  */

  static boolean trouveSortie(boolean [][] lb,
                              Position p,
                              Position origine,
                              Position sortie) {
    boolean res = false;
    Position np = new Position();
    if ( ( p.l == -1 ) || ( p.l == lb.length ) ||
         ( p.c == -1 ) || ( p.c == lb[0].length ) ) {
      sortie.l = origine.l;
      sortie.c = origine.c;
      res = true; }
      else {
      if ( lb[p.l][p.c] == true ) {
        np.c = p.c+1;
        np.l = p.l;
        if ( egal(np,origine) == false ) {
          res = trouveSortie(lb,np,p,sortie); }
        if ( res == false ) {
          np.c = p.c-1;
          np.l = p.l;
          if ( egal(np,origine) == false ) {
            res = trouveSortie(lb,np,p,sortie); }
          if ( res == false ) {
            np.c = p.c;
            np.l = p.l+1;
            if ( egal(np,origine) == false ) {
              res = trouveSortie(lb,np,p,sortie); }
            if ( res == false ) {
              np.c = p.c;
              np.l = p.l-1;
              if ( egal(np,origine) == false ) {
                res = trouveSortie(lb,np,p,sortie); } } } } } }
    return(res);
  }

/////////////////////////////////////////////////////////////////////////////////

  public static void main(String []  args) {
    Console.setTitle("Labyrinthe");
    Position p = new Position();
    p.l = 3;
    p.c = 0;
    Position o = new Position();
    o.l = 3;
    o.c = -1;
    Position sortie = new Position();
    if ( trouveSortie(labyrinthe,p,o,sortie) == true ) {
      Console.afficherln("La sortie est en position (",sortie.c,",",sortie.l,")."); }
      else {
      Console.afficherln("Il n'y a pas de sortie!"); }
  }
}