public class RechercheSortieLabyrinthe {
  
  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; };

  static boolean chercheAGauche(boolean [][] lb,int l,int c,Position p) {
    int pl = l;
    int pc = c-1;
    boolean res = false;
    if ( ( pl == -1 ) || ( pl == lb.length ) ||
         ( pc == -1 ) || ( pc == lb[0].length ) ) {
      p.l = l;
      p.c = c;
      res = true; }
      else {
      if ( lb[pl][pc] == true ) {
        res = chercheAGauche(lb,pl,pc,p);
        if ( res == false ) {
          res = chercheEnBas(lb,pl,pc,p);
          if ( res == false ) {
            res = chercheEnHaut(lb,pl,pc,p); } } } }
    return res;
  }

  static boolean chercheADroite(boolean [][] lb,int l,int c,Position p) {
    int pl = l;
    int pc = c+1;
    boolean res = false;
    if ( ( pl == -1 ) || ( pl == lb.length ) ||
         ( pc == -1 ) || ( pc == lb[0].length ) ) {
      p.l = l;
      p.c = c;
      res = true; }
      else {
      if ( lb[pl][pc] == true ) {
        res = chercheADroite(lb,pl,pc,p);
        if ( res == false ) {
          res = chercheEnBas(lb,pl,pc,p);
          if ( res == false ) {
            res = chercheEnHaut(lb,pl,pc,p); } } } }
    return res;
  }

  static boolean chercheEnBas(boolean [][] lb,int l,int c,Position p) {
    int pl = l+1;
    int pc = c;
    boolean res = false;
    if ( ( pl == -1 ) || ( pl == lb.length ) ||
         ( pc == -1 ) || ( pc == lb[0].length ) ) {
      p.l = l;
      p.c = c;
      res = true; }
      else {
      if ( lb[pl][pc] == true ) {
        res = chercheADroite(lb,pl,pc,p);
        if ( res == false ) {
          res = chercheEnBas(lb,pl,pc,p);
          if ( res == false ) {
            res = chercheAGauche(lb,pl,pc,p); } } } }
    return res;
  }

  static boolean chercheEnHaut(boolean [][] lb,int l,int c,Position p) {
    int pl = l-1;
    int pc = c;
    boolean res = false;
    if ( ( pl == -1 ) || ( pl == lb.length ) ||
         ( pc == -1 ) || ( pc == lb[0].length ) ) {
      p.l = l;
      p.c = c;
      res = true; }
      else {
      if ( lb[pl][pc] == true ) {
        res = chercheADroite(lb,pl,pc,p);
        if ( res == false ) {
          res = chercheEnHaut(lb,pl,pc,p);
          if ( res == false ) {
            res = chercheAGauche(lb,pl,pc,p); } } } }
    return res;
  }
  
/* Fonction de cherche de l'existence d'une sortie     */
/* ŕ un labyrinthe representé par un tableau        */
/* de booleens                                      */
/* La matrice lb code le labyrinthe                 */
/* Les parametres l et c donne la position actuelle */
  
  static boolean trouveSortie(boolean [][] lb,int l,int c,Position p) {
    boolean res = false;
    if ( c == 0 ) {
      res = chercheADroite(lb,l,c,p); }
      else {
      if ( c == lb[0].length-1 ) {
        res = chercheAGauche(lb,l,c,p); }
        else {
        if ( l == 0 ) {
          res = chercheEnBas(lb,l,c,p); }
          else {
          if ( l == lb.length ) {
            res = chercheEnBas(lb,l,c,p); } } } }
    return res;
  }

/////////////////////////////////////////////////////////////////////////////////
    
  public static void main(String [] args) {
    Position sortie = new Position();
    if ( trouveSortie(labyrinthe,3,0,sortie) == true ) {
      Ecran.afficherln("Il y a une sortie. Elle est en : ",sortie.l," ",sortie.c); }
      else {
      Ecran.afficherln("Il n'y a pas de sortie!"); }
  }
}