Skip to content
sudoku.hh 1.84 KiB
Newer Older
Seblu's avatar
Seblu committed

#ifndef SUDOKU_HH_
# define SUDOKU_HH_

#include <cassert>
#include <ios>
#include <iostream>
#include <fstream>
Seblu's avatar
Seblu committed
#include <sstream>
Seblu's avatar
Seblu committed

Seblu's avatar
Seblu committed
const int GRID_SIDE = 9; //must be able to divise 3

enum {
  EXIT_FOUND = 0,
  EXIT_NOTFOUND = 1,
  EXIT_USAGE = 2,
  EXIT_LOADFAIL = 3,
  EXIT_INV_POS = 4,
Seblu's avatar
Seblu committed
  EXIT_INV_VAL = 5,
  EXIT_INV_GRID = 6,
  EXIT_OTHER = 7
};

typedef std::string string;
typedef std::stringstream sstream;
typedef std::ostream ostream;

class Error
{
public:
  Error(int i);
  Error(string s = "", int i = EXIT_OTHER);
  Error(const Error &e);
  void release() const;
  string message() const;
  int code() const;
  void code(int);
  Error &operator=(const Error &rhs);
  friend ostream &operator<<(ostream &o, const Error &e);
  friend Error &operator<<(Error &e, const string &s);
  friend Error &operator>>(Error &e, const string &s);
  friend Error &operator<<(Error &e, int val);
protected:
  sstream msg_;
  int val_;
Seblu's avatar
Seblu committed
};

Seblu's avatar
Seblu committed
class Block
{
public:
Seblu's avatar
Seblu committed
  inline Block(int val);
Seblu's avatar
Seblu committed
  inline bool is_forbidden(int val) const throw (Error);
Seblu's avatar
Seblu committed
  inline int forbidden_count() const;
Seblu's avatar
Seblu committed
  inline bool is_set() const;
Seblu's avatar
Seblu committed
  inline int get() const;
Seblu's avatar
Seblu committed
  inline void set(int val) throw (Error);
  inline void forbid(int val) throw (Error);
  inline friend ostream &operator<<(ostream &stream, const Block &blk);
protected:
Seblu's avatar
Seblu committed
  int value_;
  bool forbidden_[GRID_SIDE];
};

class Grid
{
public:
Seblu's avatar
Seblu committed
  void load(const char *filename) throw (Error);
Seblu's avatar
Seblu committed
  void print() const;
Seblu's avatar
Seblu committed
  inline void print_line() const;
Seblu's avatar
Seblu committed
  bool check(sstream &info) const;
  void solve();
  void pose(int x, int y, int v) throw (Error);
  bool operator==(const Grid &b) const;
  inline bool operator!=(const Grid &b) const;
Seblu's avatar
Seblu committed
  static bool verbose;
Seblu's avatar
Seblu committed
  static bool advprint;
Seblu's avatar
Seblu committed
protected:
  int solve_complete_block();
  int solve_square();
  int solve_line();
Seblu's avatar
Seblu committed
  Block block_[GRID_SIDE][GRID_SIDE];
};

Seblu's avatar
Seblu committed
#include "block.hxx"
Seblu's avatar
Seblu committed
#include "grid.hxx"
Seblu's avatar
Seblu committed

Seblu's avatar
Seblu committed
#endif