/* titel: springer.c, Roesselsprung-Programm */
#include <stdio.h>

#define ZZ 8                                 /* Feldgroesse */

int FELD[ ZZ ][ ZZ ];                        /* Feld                  */
int a[] = { 2, 1, -1, -2, -2, -1,  1,  2 };  /* Koordinaten der       */
int b[] = { 1, 2,  2,  1, -1, -2, -2, -1 };  /* Springerzuege         */

int z, xx, yy;

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;                
      if ( FELD[u][v] == z*z )
        q = 1;
      else
        if ( (q = versuche( u, v) ) == 0)
          FELD[u][v] = 0;
    }
  }
  return(q);
}

void drucke() {
  int i, j;
  printf("\n");
  for (i = 0; i < z; i++) {
    for (j = 0; j < z; j++)
      printf("%3d", FELD[i][j]);
    printf("\n");
  }
}

int main() {
  z = 4;

  printf("Zeilen (<=%d): ", ZZ);
  while ( scanf("%d",&z) != 1 ) {
    getchar();
    printf("\nFehlerhafte Eingabe, bitte Zahl <= %d eingeben: ", ZZ);
  }
  if ( z <= 1 || z > ZZ) return 0;
  { int i,j;
    for (i=0;i<z;i++)
      for (j=0;j<z;j++)
        FELD[i][j] = 0;
  }
  printf("Anfangswerte xx yy <= %d: ", z);
  while (scanf("%d %d", &xx, &yy) != 2) {
    getchar();
    printf("\nFehlerhafte Eingabe, bitte zwei Zahlen <= %d eingeben: ", z);
  }
  FELD[ xx-1 ][ yy-1 ] = 1;
  if ( versuche( xx-1, yy-1) )
    drucke();
  else printf("\nKeine Loesung\n");
}
