class KnightsTour {
static int[][] brett;
static int bredde, bredde2;
static long antFors?k;
public static void main (String[] args) {
bredde = Integer.parseInt(args[0]);
bredde2 = bredde * bredde;
brett = new int[bredde][bredde];
flytt(1, 0, 0);
System.out.printf("Ingen l?sninger etter %,d trekk!\n",
antFors?k);
}
static void tegnBrett () {
for (int rx = bredde-1; rx >= 0; rx--) {
for (int kx = 0; kx < bredde; kx++) {
System.out.printf("%4d",brett[kx][rx]);
}
System.out.println();
}
}
static void flytt (int trekk, int r, int k) {
++antFors?k;
// Er det lov ? flytte hit?
if (r < 0 || r >= bredde) return;
if (k < 0 || k >= bredde) return;
if (brett[r][k] > 0) return;
// Det er lov, s? vi pr?ver ? flytte hit.
brett[r][k] = trekk;
// Har vi funnet en l?sning?
if (trekk == bredde2) {
System.out.printf("L?sning etter %,d trekk\n",
antFors?k);
tegnBrett(); System.exit(1);
}
// Pr?v ? flytte videre:
flytt(trekk+1, r+2, k+1); flytt(trekk+1, r+2, k-1);
flytt(trekk+1, r+1, k+2); flytt(trekk+1, r+1, k-2);
flytt(trekk+1, r-1, k+2); flytt(trekk+1, r-1, k-2);
flytt(trekk+1, r-2, k+1); flytt(trekk+1, r-2, k-1);
// Det gikk ikke; da trekker vi oss tilbake.
brett[r][k] = 0;
}
}