#include using namespace std; const int NMax = 15; int Map[NMax][NMax]; bool row[NMax][NMax]; bool col[NMax][NMax]; bool box[NMax][NMax]; int wbx[NMax][NMax]; bool getState(int x, int y, int value) { if((Map[x][y] != 0) || row[x][value] || col[y][value] || box[wbx[x][y]][value]) return false; return true; } struct var{ int x, y, ways, value; bool operator < (const var &a) { return ways < a.ways; } }; vector < var > getRoute(const int &n) { vector < var > ret; for(int i = 1; i <= n; i++) { for(int pick = 1; pick <= n; pick++) { int ways = 0; vector < pair < int, int > > aux; for(int j = 1; j <= n; j++) { if(getState(i, j, pick) == true) { ways++; aux.push_back({i, j}); } } if(ways != 0) { for(auto const &it: aux) { ret.push_back({it.first, it.second, ways, pick}); } } } } for(int i = 1; i <= n; i++) { for(int pick = 1; pick <= n; pick++) { int ways = 0; vector < pair < int, int > > aux; for(int j = 1; j <= n; j++) { if(getState(j, i, pick) == true) { ways++; aux.push_back({j, i}); } } if(ways != 0) { for(auto const &it: aux) { ret.push_back({it.first, it.second, ways, pick}); } } } } for(int bx = 1; bx <= n; bx++) { for(int pick = 1; pick <= n; pick++) { int ways = 0; vector < pair < int, int > > aux; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(wbx[i][j] == bx && getState(i, j, pick)) { ways++; aux.push_back({i, j}); } } } if(ways != 0) { for(auto const &it: aux) { ret.push_back({it.first, it.second, ways, pick}); } } } } sort(ret.begin(), ret.end()); return ret; } void Update(int x, int y, int value, bool place) { row[x][value] = place; col[y][value] = place; box[wbx[x][y]][value] = place; if(place == true) { Map[x][y] = value; } else { Map[x][y] = 0; } } bool solved = false; void Back(int zero) { if(zero == 0) { solved = true; return; } vector < var > now = getRoute(9); for(auto const &it: now) { int x, y, value; x = it.x; y = it.y; value = it.value; Update(x, y, value, true); Back(zero - 1); if(solved == true) return; Update(x, y, value, false); } } int main() { int n = 9; int zaz; cin >> zaz; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { cin >> Map[i][j]; } } int actBox = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(wbx[i][j] == 0) { actBox++; for(int x = i; x < i + 3; x++) { for(int y = j; y < j + 3; y++) { wbx[x][y] = actBox; } } } } } int zero = 0; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(Map[i][j] != 0) { Update(i, j, Map[i][j], true); } else { zero++; } } } Back(zero); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { cout << Map[i][j] << " "; } cout << "\n"; } /* for(auto const &it: test) { fout << it.x << " " << it.y << " " << it.ways << " " << it.value << "\n"; } */ return 0; }