79 lines
1.5 KiB
Java
79 lines
1.5 KiB
Java
class List<T> {
|
|
T head;
|
|
List<T> tail;
|
|
|
|
List(T h, List<T> t) {
|
|
head = h;
|
|
tail = t;
|
|
}
|
|
|
|
static <T> int len( List<T> xs ) {
|
|
int n = 0;
|
|
while(xs != null) {
|
|
n++;
|
|
xs = xs.tail;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
static<T> List<T> Cons( T h, List<T> t ) {
|
|
return new List<T>(h,t);
|
|
}
|
|
|
|
}
|
|
|
|
public class nqueens {
|
|
static boolean safe( int queen, List<Integer> xs ) {
|
|
int diag = 1;
|
|
while(xs != null) {
|
|
int q = xs.head;
|
|
if (queen == q || queen == (q + diag) || queen == (q - diag)) {
|
|
return false;
|
|
}
|
|
diag++;
|
|
xs = xs.tail;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static List<List<Integer>> appendSafe( int k, List<Integer> soln, List<List<Integer>> solns ) {
|
|
List<List<Integer>> acc = solns;
|
|
while(k > 0) {
|
|
if (safe(k,soln)) {
|
|
acc = List.Cons(List.Cons(k,soln),acc);
|
|
}
|
|
k--;
|
|
}
|
|
return acc;
|
|
}
|
|
|
|
static List<List<Integer>> extend( int n, List<List<Integer>> solns ) {
|
|
List<List<Integer>> acc = null;
|
|
List<List<Integer>> cur = solns;
|
|
while(cur != null) {
|
|
acc = appendSafe(n, cur.head, acc);
|
|
cur = cur.tail;
|
|
}
|
|
return acc;
|
|
}
|
|
|
|
static List<List<Integer>> findSolutions( int n ) {
|
|
int k = 0;
|
|
List<List<Integer>> acc = List.Cons(null,null);
|
|
while(k < n) {
|
|
acc = extend(n,acc);
|
|
k++;
|
|
}
|
|
return acc;
|
|
}
|
|
|
|
|
|
static int nqueens(int n) {
|
|
return List.len(findSolutions(n));
|
|
}
|
|
public static void main(String args[])
|
|
{
|
|
System.out.println( nqueens(Integer.parseInt(args[0])) );
|
|
}
|
|
}
|