import roboapp.javakara.JavaKaraProgram;

// Anpassung an Javakara
// von Clemens Adolphs und Tom Mannheim
// Informatik-Grundkurs 11 (2001/2002)
// Immanuel-Kant-Gymnasium Heiligenhaus

public class AchtDamenKara extends JavaKaraProgram
{
 boolean[]   zeilen;         //Ein Array, um besetzte Zeilen zu markieren!
 boolean[]   spalten;        //Ein Array für die besetzten Spalten
 boolean[]   stgDiagonalen;  //Ein Array für die steigenden Diagonalen
 boolean[]   fallDiagonalen; //Ein Array für die fallenden Diagonalen

 final int   maxDamen = 8;   //Anzahl der Damen, die gesetzt werden sollen
 int         aktDamen = 0;   //Anzahl der bereits gesetzten Damen

 void InitArrays()
 { zeilen = new boolean[9];
   //Wir wollen hier ein 8x8 Feld benutzen
   //Wir nehmen 9, damit 8 als grösster Index benutzt werden kann.
   //zeile[0] wird daher nie benutzt
   spalten = new boolean[9];
   //Es gibt je 15 Diagonalen!
   stgDiagonalen = new boolean[16];
   fallDiagonalen = new boolean[16];

   for (int i = 0; i < 9; i++)
   { zeilen[i] = false;
     spalten[i] = false;
   }
   for (int i = 0; i < 16; i++)
   { stgDiagonalen[i] = false;
     fallDiagonalen[i] = false;
   }
 } //InitArrays()

 void setzeDame(int x, int y)
 {
  kara.setPosition(x-1, y-1); // In Kara-Koordinaten umsetzen, wo Links Oben
  kara.putLeaf();             // (0/0) und nicht (1/1) ist.
  zeilen[x] = true;
  spalten[y] = true;
  stgDiagonalen[x+y-1] = true;
  fallDiagonalen[x - y + 8] = true;
  aktDamen++;
 }

 void nimmDame(int x, int y)
 {
  kara.setPosition(x-1, y-1); // In Kara-Koordinaten umsetzen, wo Links Oben
  kara.removeLeaf();          // (0/0) und nicht (1/1) ist.
  zeilen[x] = false;
  spalten[y] = false;
  stgDiagonalen[x+y-1] = false;
  fallDiagonalen[x - y + 8] = false;
  aktDamen--;
 }

 boolean fertig()
 {
  return (aktDamen == maxDamen);
 }

 void naechsterSchritt(int y)
 {
  for (int x = 1; x <= 8; x++)
  {
   kara.setPosition(x-1,y-1);
   if (    !spalten[y] &&
           !zeilen[x] &&
           !stgDiagonalen[x+y-1] &&
           !fallDiagonalen[x-y+8])
        { //Feld nicht bedroht!
          setzeDame(x,y);
          if (fertig())
               { tools.showMessage("Eine Loesung wurde gefunden!");
               }
          else { naechsterSchritt(y+1);
               }
          nimmDame(x,y);
        }
  } // for
 }//naechsterSchritt()

 protected void myProgram()
 {
  InitArrays();
  naechsterSchritt(1);
 }
}
