class VierFarben
{ static final int   laenderAnzahl = 6;
  static char[]      farbTabelle;
  static char[]      faerbung;
  static boolean[][] esGibtGrenze;
  static int         loesungsAnzahl = 0;

  static void initArrays()
  {  farbTabelle = new char[5];
     farbTabelle[1] = 'R';
     farbTabelle[2] = 'B';
     farbTabelle[3] = 'G';
     farbTabelle[4] = 'W';
     faerbung = new char[laenderAnzahl+1];
     for (int i=1; i<=laenderAnzahl; i++)
          faerbung[i] = 'X'; // soll keine Faerbung darstellen
     esGibtGrenze = new boolean[laenderAnzahl+1][laenderAnzahl+1];
     for (int land1=1; land1<=laenderAnzahl; land1++)
     {  for (int land2=land1+1; land2<=laenderAnzahl; land2++)
             esGibtGrenze[land1][land2] = false;
     } // for land1
     // Es wird nur eine Haelfte der Matrix benoetigt.
     esGibtGrenze[1][2] = true;
     esGibtGrenze[1][3] = true;
     esGibtGrenze[1][5] = true;
     esGibtGrenze[1][6] = true;
     esGibtGrenze[2][3] = true;
     esGibtGrenze[2][5] = true;
     esGibtGrenze[3][4] = true;
     esGibtGrenze[3][5] = true;
     esGibtGrenze[3][6] = true;
     esGibtGrenze[4][6] = true;
     esGibtGrenze[5][6] = true;
  } // initArrays

  static void loesungAusgeben()
  { for (int land=1; land<=laenderAnzahl; land++)
      Out.print(faerbung[land]);
    Out.print(" ");
    loesungsAnzahl++;
    if (loesungsAnzahl%5==0)
         Out.println();
  } // loesungAusgeben

  static boolean faerbungErlaubt(int land)
  { boolean erlaubt = true;
    // Nur die Laender mit kleinerer Nummer beachten
    for (int landLauf=1; landLauf<land; landLauf++)
    { if (esGibtGrenze[landLauf][land] &&
          faerbung[landLauf]==faerbung[land])
           erlaubt = false;
    } // for landLauf
    return erlaubt;
  } // faerbungErlaubt

  static void versucheNaechstesLandZuFaerben(int land)
  { for (int farbNr=1; farbNr<=4; farbNr++)
    {  faerbung[land] = farbTabelle[farbNr];
       if (faerbungErlaubt(land))
            {  if (land<laenderAnzahl)
                    versucheNaechstesLandZuFaerben(land+1);
               else loesungAusgeben();
            }
    } // for farbNr
  } // versucheNaechstesLandZuFaerben

  public static void main(String[] arg)
  { initArrays();
    Out.print("Das Programm bestimmt alle Loesungen des ");
    Out.println("Vier-Farben-Problems fuer die gegebene Anordnung.");
    Out.println(" |--------------------------------------|");
    Out.println(" |                   1                  |");
    Out.println(" |  |-----------------------------|     |");
    Out.println(" |  |    |                        |-----|");
    Out.println(" |--|    |                        |     |");
    Out.println(" |  | 2  |         3      |-------|     |");
    Out.println(" |  |    |                |   4   |     |");
    Out.println(" |  |    |                |       |     |");
    Out.println(" |  |----|-------|----------------|     |");
    Out.println(" |     5         |            6         |");
    Out.println(" |---------------|----------------------|");
    Out.print("Mit RETURN geht es los!");
    String quatsch = In.readLine();
    faerbung[1] = farbTabelle[1];
    versucheNaechstesLandZuFaerben(2);
    Out.println();
    Out.println("Es ergaben sich "+loesungsAnzahl+" Loesungen.");
  } // main
} // class VierFarben
