# Solving N+k Queens Using Dancing Links Matthew A. Wolff Morehead State University May 19, 2006.

## Presentation on theme: "Solving N+k Queens Using Dancing Links Matthew A. Wolff Morehead State University May 19, 2006."— Presentation transcript:

Solving N+k Queens Using Dancing Links Matthew A. Wolff Morehead State University May 19, 2006

Agenda  Motivation  Terms  Problem Definition  Timing Results for various N+1 Programs  Future Work

Motivation  NASA EPSCoR grant  (Subcontract # WKURF 516140-06-15)  Began working with Chatham and Skaggs in November  Doyle added DLX (Dancing Links) at beginning of Spring '06 semester  Senior Project

Category of Problems  8 Queens  8 attacking queens on an 8x8 chess board  N Queens  N attacking queens on an NxN chess board  N+1 Queens  N+1 attacking queens on an NxN chess board  1 Pawn used to block two or more attacking queens  N+k Queens  N+k attacking queens on an NxN chess board  k Pawns used to block numerous attacking queens

Recursion  "To understand recursion, one must first understand recursion" -- Tina Mancuso understandrecursion understandrecursionunderstandrecursion understandrecursion  “A function is recursive if it can be called while active (on the stack).”  i.e. It calls itself

Recursion in Art

Recursion in Computer Science  // precondition: n >= 0 // postcondition: n! is returned factorial (int n) { if (n == 1) or (n == 0) return 1; else return (n*factorial(n-1)); }

Backtracking  An example of backtracking is used in a depth-first search in a binary tree:  Let t be a binary tree  depthfirst(t) { if (t is not empty) { access root item of t; depthfirst(left(t)); depthfirst(right(t)); } }

Backtracking Example Output: A – B – D – E – H – I – C – F - G

Main Focus: N+k Queens  Why?  Instead of focusing on specific solutions (N+1, N+2,...), we will be able to solve any general statement (N+k) of the “Queens Problem.”  Implementing a solution is rigorous and utilizes many important techniques in computer science such as parallel algorithm development, recursion, and backtracking

Chatham, Fricke, Skaggs  Proved N+k queens can be placed on an NxN board with k pawns.

N+K – what to do?  N+k presents a very large problem  1 Pawn meant an extra for loop around everything  k Pawns would imply k for loops around everything  Dynamic for loops?  Search for a better way…  Dancing Links

Why “Dancing Links?”  Structure & Algorithm  Comprehendible (Open for Debate…)  Increased performance  DLX is supposedly quicker than a standard backtracking algorithm  Made popular by Knuth via his circa 2000 article

“The Universe”  Multi-Dimensional structure composed of circular, doubly linked-lists  Each row and column is a circular, doubly linked-list

Visualization of “The Universe”

The Header node  The “root” node of the entire structure  Members:  Left pointer  Right pointer  Name (H)  Size: Number of “Column Headers” in its row.

Column Headers  Column Headers are nodes linked horizontally with the Header node  Members:  Left pointer  Right pointer  Up pointer  Down pointer  Name (R w, F x, A y, or B z )  Size: the number of “Column Objects” linked vertically in their column

Column Objects  Grouped in two ways:  All nodes in the same column are members of the same Rank, File, or Diagonal on the chess board  Linked horizontally in sets of 4  {R w, F x, A y, or B z }  Each set represents a space on the chess board  Same members as Column Headers, but with an additional “top pointer” which points directly to the Column Header

Mapping the Chess Board

The Amazing TechniColor Chess Board

The Dance Steps  The entire algorithm is based off of two simple ideas:  Cover: remove an item  Node.right.left = Node.left  Node.left.right = Node.right  Uncover: insert the item back  Node.right.left = Node  Node.left.right = Node

Dance Steps, cont.  void search(k): if (header.right == header) {finished} else c = choose_column() cover(c) r = c.down while (r != c) j = r.right while (j != r) cover(j.top) j = j.right # place next queen search(k+1) c = r.top j = r.left while (j != r) uncover(j.top) j = j.left # completed search(k) uncover(c) {finished}

1x1 Universe: Before

1x1 Universe: After

Modifying for N+k Queens  1 Pawn will cut its row, column, and diagonal into 2 separate pieces  Just add these 4 new Column Headers to the universe, along with their respective Column Objects  k Pawns will cut their rows, columns, and diagonals into…. ? separate pieces.  Still need to add these extra Column Headers, but how many are there and how many Column Objects are in each?

It Slices, It Dices…  Find ALL valid Pawn Placements  (N-2) 2 choose k = lots of combinations  Then build 4 NxN arrays  One for each Rank, File, and Diagonal  “Scan” through arrays:  For Ranks: scan horizontally (Files: vertically, Diagonals: diagonally)  Reach the end or a Pawn, increment 1

Example of Rank “Scan”

N+1 Queens Varying Language, Algorithm

N+1 Queens Parallel Backtracking vs. DLX

N+1 Queens Sequential DLX vs. Parallel DLX

Interesting Tidbit: Sequential DLX vs. Parallel C++

Questions?  Thank you!  Dr. Chatham  Dr. Doyle  Mr. Skaggs

References