diff options
author | Thomas Günther <tom@toms-cafe.de> | 2005-10-28 03:00:00 +0200 |
---|---|---|
committer | Thomas Günther <tom@toms-cafe.de> | 2005-10-28 03:00:00 +0200 |
commit | a0863e7f249e0a4eae8f71f8946cb90071fba985 (patch) | |
tree | db2138d8e12e3138d7305bc0c6e5679fdd3163af /generator.h | |
download | vdr-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.h | 77 |
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 |