#include using namespace std; int grid[9][9]; bool used[9][9][10] = {0}; int numEmpty = 0; void update(int row, int col, int val) { grid[row][col] = val; for(int v=1; v<=9; v++) used[row][col][v] = true; for(int r=0; r<9; r++) used[r][col][val] = true; for(int c=0; c<9; c++) used[row][c][val] = true; row = (row/3)*3; col = (col/3)*3; for(int r=row; r> val; if (val == 0) numEmpty++; else update(r, c, val); } } bool change; do { change = false; int val; // check single value case for(int r=0; r<9; r++) { for(int c=0; c<9; c++) { if (grid[r][c] != 0) continue; if ((val = checkForSingle(r,c)) > 0) { update(r, c, val); change = true; numEmpty--; } } } /**/ // check for unique location case // rows first int rr, cc; for(int r=0; r<9; r++) { for(int val=1; val<=9; val++) { if (foundUniqueRowLoc(r, val, cc)) { update(r, cc, val); change = true; numEmpty--; } } } // cols next for(int c=0; c<9; c++) { for(int val=1; val<=9; val++) { if (foundUniqueColLoc(c, val, rr)) { update(rr, c, val); change = true; numEmpty--; } } } // then subgrids for(int r=0; r<9; r+=3) { for(int c=0; c<9; c+=3) { for(int val=1; val<=9; val++) { if (foundUniqueSubLoc(r, c, val, rr, cc)) { update(rr, cc, val); change = true; numEmpty--; } } } } /**/ } while (change); if (numEmpty == 0) { cout << "Easy" << endl; } else { cout << "Not easy" << endl; } printgrid(); }