00001 #include <iostream.h> 00002 #include <fstream.h> 00003 using namespace std; 00004 00005 #ifndef PUZZLE_H 00006 #define PUZZLE_H 00007 00011 class Puzzle { 00012 00013 private: 00014 00020 typedef unsigned short int Cell; 00021 00026 Cell ***cells_; 00027 00032 size_t assignedCells_; 00033 00037 size_t rows_; 00038 00042 size_t columns_; 00043 00047 size_t length_; 00048 00052 size_t VALUE; 00053 00057 size_t NUM_CANDS; 00058 00062 char *exceptionMsg; 00063 00067 void init(Cell*** cells); 00068 00073 void setup(ifstream &in); 00074 00078 void cleanup(); 00079 00085 bool pruneRow(size_t i, size_t j); 00086 00092 bool pruneColumn(size_t i, size_t j); 00093 00099 bool pruneBlock(size_t i, size_t j); 00100 00107 bool pruneCell(size_t i, size_t j, const Cell &value); 00108 00114 bool isValidRowOrColumn(size_t i, bool row) const; 00115 00119 bool isValidRow(size_t i) const; 00120 00124 bool isValidColumn(size_t i) const; 00125 00129 bool isValidBlock(size_t i) const; 00130 00131 public: 00132 00138 Puzzle(size_t rows, size_t columns, ifstream &in); 00139 00143 ~Puzzle(); 00144 00148 Puzzle(const Puzzle &p); 00149 00154 Puzzle& operator=(const Puzzle &p); 00155 00161 void setCell(size_t x, size_t y, size_t value); 00162 00167 void update(); 00168 00172 void saveCandidates(size_t x, size_t y, bool candidates[]); 00173 00177 Cell getCellValue(size_t i, size_t j) const { return cells_[i][j][VALUE]; } 00178 00182 size_t getNumCandidates(size_t i, size_t j) const { return cells_[i][j][NUM_CANDS]; } 00183 00187 bool isComplete() const { return assignedCells_ == (length_ * length_); } 00188 00192 size_t getRows() const { return rows_; } 00193 00197 size_t getColumns() const { return columns_; } 00198 00202 size_t getLength() const { return length_; } 00203 00207 bool isValid() const; 00208 00212 void print() const; 00213 00214 void printCandidates() const; 00215 00216 void printCandidates(size_t x, size_t y) const; 00217 00221 void debug() const; 00222 }; 00223 00224 #endif