summaryrefslogtreecommitdiff
path: root/generator.h
diff options
context:
space:
mode:
authorThomas Günther <tom@toms-cafe.de>2005-10-28 03:00:00 +0200
committerThomas Günther <tom@toms-cafe.de>2005-10-28 03:00:00 +0200
commita0863e7f249e0a4eae8f71f8946cb90071fba985 (patch)
treedb2138d8e12e3138d7305bc0c6e5679fdd3163af /generator.h
downloadvdr-plugin-sudoku-0.1.0.tar.gz
vdr-plugin-sudoku-0.1.0.tar.bz2
Initial versionv0.1.0
Diffstat (limited to 'generator.h')
-rw-r--r--generator.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/generator.h b/generator.h
new file mode 100644
index 0000000..8266b84
--- /dev/null
+++ b/generator.h
@@ -0,0 +1,77 @@
+/*
+ * Sudoku: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: generator.h 11 2005-10-28 01:00:01Z tom $
+ */
+
+#ifndef VDR_SUDOKU_GENERATOR_H
+#define VDR_SUDOKU_GENERATOR_H
+
+#include "sudoku.h"
+#include "backtrack.h"
+#include "puzzle.h"
+
+
+namespace Sudoku
+{
+
+ //--- class Sudoku::Generator ------------------------------------------------
+
+ /** Implementation of a backtracking algorithm to generate Sudoku puzzles
+ *
+ * To generate Sudoku puzzles two nested backtracking algorithms are used.
+ * First a random Sudoku solution is searched. Then the algorithm tries to
+ * remove some numbers so that only the requested number of givens remains.
+ * Each puzzle is checked with the nested solver algorithm if there is only
+ * one solution.
+ *
+ * Example:
+ *
+ * \code
+ * Puzzle puzzle;
+ * Generator generator(puzzle, 36);
+ * generator.find_next_solution();
+ * bool found = generator.solution_is_valid();
+ * \endcode
+ */
+ class Generator : public BackTrack::Algorithm, public BackTrack::Solution
+ {
+ Puzzle& puzzle;
+ Puzzle sudoku;
+ unsigned int free_list[SDIM];
+ unsigned int free_count;
+ Pos pos_list[SDIM];
+ unsigned int pos_count;
+ bool symmetric;
+ bool free_center;
+
+ public:
+
+ /** Constructor */
+ Generator(Puzzle& puzzle, unsigned int givens_count,
+ bool symmetric = true, unsigned int max_iter = 0);
+
+ /** Set the element to the first sibling. */
+ virtual void set_first_at(unsigned int level);
+
+ /** Set the element to the next sibling. */
+ virtual void set_next_at(unsigned int level);
+
+ /** Reset the element. */
+ virtual void reset_at(unsigned int level);
+
+ /** Check if the element is set to the last sibling. */
+ virtual bool is_last_at(unsigned int level) const;
+
+ /** Check if the element is valid (following elements ignored). */
+ virtual bool is_valid_at(int level) const;
+
+ /** Check if the level is the last possible level. */
+ virtual bool is_last_level(int level) const;
+ };
+
+} // namespace Sudoku
+
+#endif // VDR_SUDOKU_GENERATOR_H