#include <stdio.h>  /* titel: anisp.c; "animierter" Roesselsprung mit */
#include <ncurses.h> /* Bildschirmausgabe der Loesungssuche            */
/* Uebersetzung mit "gcc -o anisp anisp.c -lncurses"         */
/* evtl. auch       "gcc -o anisp anisp.c -lncurses -ltinfo" */
#define ZZ  8                                /* Feldgroesse           */
int z = ZZ, FELD[ ZZ ][ ZZ ];   
int a[] = { 2, 1, -1, -2, -2, -1,  1,  2 };  /* Koordinaten der       */
int b[] = { 1, 2,  2,  1, -1, -2, -2, -1 };  /* Springerzuege         */
int xx0 = 25, yy0 = 5;         /* Linke obere Ecke des Ausgabequadrates */

/* outxy(x,y) schreibt die Zahl FELD[x][y] auf
   die entsprechende Position auf den Bildschirm. */
void outxy(int x, int y) {
  mvcur(0, 0, yy0+y, xx0+3*x); 
  if ( FELD[x][y]) printf("%3d", FELD[x][y]); 
  else   printf("   ");
  fflush(stdout);
  mvcur(yy0+y, xx0+3*x+3, 0, 0);  
}

void reset(){ 
  int i,j;
  for (i = 0; i < z; i++)
    for ( j = 0;j < z;j ++)
      FELD[i][j] = 0;
}

int versuche( int x, int y) { 
  int k, q, u, v;
  for (k = q = 0; q == 0 && k < 8; k++) {
    u = x+a[k]; v = y+b[k];
    if ( 0 <= u && u < z && 0 <= v && v < z && FELD[u][v] == 0 ){
      FELD[u][v] = FELD[x][y] + 1;
      outxy( u, v);
      if ( FELD[u][v] ==  z*z ) {
        q = 1;
      }
      else if ( ( q = versuche(u,v) ) == 0) {
        FELD[u][v] = 0; outxy( u, v);
      }
    }
  }
  return q;
}

int main() { 
  int x, y;
  char c;
  while ( 1 ) {
    printf("Zeilen: ");       
    while ( scanf("%d",&z) != 1 ) {
      getchar();
      printf("Fehlerhafte Eingabe, bitte Zahl <= %d eingeben: ", ZZ);
    }
    if ( z <= 1 || z > ZZ) return 0;
    printf("Anfangswerte x y = ");       
    while (scanf("%d %d", &x, &y) != 2) {
      getchar();
      printf("Fehlerhafte Eingabe, bitte zwei Zahlen <= %d eingeben: ", z);
    }
    x--; y--;

    reset(); 
    initscr(); 
    refresh();
    FELD[x][y] = 1;
    outxy(x,y);

    versuche(x,y);
    refresh();
    getch();
    endwin();
    return 0;
  }
}
