// derived from Niklaus Wirth's Pascal program (therefore not idiomatic Java) // from "Algorithms + Data Structures = Programs", Prentice-Hall 1976 // modified to produce and count all solutions // Problem: Zaehle die Loesungen fuer folgendes Problem: Setze N Damen // auf einem NxN-Schachbrett so, dass keine Dame eine andere schlagen // kann. public class nqueens { static int maxn=100; static int n; static boolean[] a=new boolean[maxn+1]; // 1..n // a[x] ist true, wenn man in Spalte x eine Dame setzen kann static boolean[] b=new boolean[2*maxn+1]; // 2..2*n // b[x+y] ist true, wenn man in der Diagonale, // die die Felder (x+k, y-k) (fuer alle k) enthaelt, eine Dame setzen kann static boolean[] c=new boolean[2*maxn]; // 1..2*n-1 // c[x-y+n] ist true, wenn man in der Diagonale, // die die Felder (x+k, y+k) (fuer alle k) enthaelt, eine Dame setzen kann static int[] x=new int[maxn+1]; // 1..n // x[y] enthaelt die Spalten der aktuellen (Teil)loesung static int i; static long count=0; public static void try1(int i) { int j=0; do { j=j+1; if (a[j] && b[i+j] && c[i-j+n]) { x[i]=j; a[j]=false; b[i+j]=false; c[i-j+n]=false; if (i