// simpel C++-skeletprogramma om met sudoku's te werken, voor college AI // Walter Kosters, 18 januari 2006 // Compiler: g++ #include #include // voor random getallen using namespace std; // geef random getal tussen min en max, grenzen inbegrepen int randomgetal (int min, int max) { return ( min + ( rand ( ) % (max-min+1) ) ); }//randomgetal class Sudoku { public: void drukpuzzelaf ( ); void drukoplossingaf ( ); void druktoegestaanaf ( ); void initleeg ( ); bool mag (int i, int j, int k); void zet (int i, int j, int k); void verbied (int i, int j, int k); void statoe (int i, int j, int k); void maakpuzzel ( ); private: int depuzzel[10][10]; int deoplossing[10][10]; bool toegestaan[10][10][10]; // op i,j,k true als (i,j) k mag zijn };//Sudoku // druk puzzel af op beeldscherm void Sudoku::drukpuzzelaf ( ) { int i, j; cout << endl; for ( i = 1; i <= 9; i++ ) { for ( j = 1; j <= 9; j++ ) if ( depuzzel[i][j] != 0 ) cout << depuzzel[i][j] << " "; else cout << "-" << " "; cout << endl; }//for cout << endl; }//Sudoku::drukpuzzelaf // druk oplossing af op beeldscherm void Sudoku::drukoplossingaf ( ) { int i, j; cout << endl; for ( i = 1; i <= 9; i++ ) { for ( j = 1; j <= 9; j++ ) cout << deoplossing[i][j] << " "; cout << endl; }//for cout << endl; }//Sudoku::drukoplossingaf // druk wat is toegestaan af op beeldscherm void Sudoku::druktoegestaanaf ( ) { int i, j, k, p; cout << endl << " #"; for ( j = 1; j <= 71; j++ ) cout << "*"; cout << "#" << endl; for ( i = 1; i <= 9; i++ ) { for ( p = 0; p < 3; p++ ) { cout << " # "; for ( j = 1; j <= 9; j++ ) { for ( k = 1+(p*3); k <= 3*(p+1); k++ ) if ( toegestaan[i][j][k] ) cout << k << " "; else cout << " " << " "; if ( j % 3 == 0 ) cout << "# "; else cout << "| "; }//for cout << endl; }//for cout << " #"; for ( j = 1; j <= 71; j++ ) if ( i % 3 == 0 ) cout << "*"; else if ( j == 24 || j == 48 ) cout << "#"; else cout << "-"; cout << "#" << endl; }//for cout << endl; }//Sudoku::druktoegestaanaf // maak alles "leeg" void Sudoku::initleeg ( ) { int i, j, k; for ( i = 1; i <= 9; i++ ) for ( j = 1; j <= 9; j++ ) { depuzzel[i][j] = 0; deoplossing[i][j] = 0; for ( k = 1; k <= 9; k++ ) toegestaan[i][j][k] = true; }//for }//Sudoku::initleeg // mag getal k op plek (i,j)? bool Sudoku::mag (int i, int j, int k) { return toegestaan[i][j][k]; }//Sudoku::mag // verbied k op plek (i,j) void Sudoku::verbied (int i, int j, int k) { toegestaan[i][j][k] = false; }//Sudoku::verbied // sta k toe op plaats (i,j) void Sudoku::statoe (int i, int j, int k) { toegestaan[i][j][k] = true; }//Sudoku::verbied // zet k op (i,j) - aannemende dat het mag void Sudoku::zet (int i, int j, int k) { int i1, j1, k1, liboi, liboj; depuzzel[i][j] = k; for ( k1 = 1; k1 <= 9; k1++ ) toegestaan[i][j][k1] = false; for ( i1 = 1; i1 <= 9; i1++ ) toegestaan[i1][j][k] = false; for ( j1 = 1; j1 <= 9; j1++ ) toegestaan[i][j1][k] = false; liboi = 1 + 3 * ( (i-1)/3 ); // linksboven in 3x3 blok van (i,j) liboj = 1 + 3 * ( (j-1)/3 ); for ( i1 = 0; i1 < 3; i1++ ) for ( j1 = 0; j1 < 3; j1++ ) toegestaan[liboi+i1][liboj+j1][k] = false; toegestaan[i][j][k] = true; }//Sudoku::zet // maak (wellicht niet oplosbare!!!) puzzel void Sudoku::maakpuzzel ( ) { int i, j, k, aantal = 10 + randomgetal (1,20), tel; initleeg ( ); for ( tel = 0; tel < aantal; tel++ ) { i = randomgetal (1,9); j = randomgetal (1,9); k = randomgetal (1,9); if ( mag (i,j,k) ) zet (i,j,k); }//for }//Sudoku::maakpuzzel int main ( ) { srand (42); // voor randomseed Sudoku sudo; sudo.maakpuzzel ( ); sudo.drukpuzzelaf ( ); sudo.druktoegestaanaf ( ); return 0; }//main