#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> MeraSudoku;
bool rowUsed[9][10]{};
bool colUsed[9][10]{};
bool boxUsed[9][10]{};
int getBoxIndex(int row, int col) {
return (row / 3) * 3 + (col / 3);
}
bool solve() {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (MeraSudoku[i][j] == 0) {
for (int num = 1; num <= 9; ++num) {
int boxIdx = getBoxIndex(i, j);
if (!rowUsed[i][num] && !colUsed[j][num] && !boxUsed[boxIdx][num]) {
MeraSudoku[i][j] = num;
rowUsed[i][num] = colUsed[j][num] = boxUsed[boxIdx][num] = true;
if (solve()) return true;
MeraSudoku[i][j] = 0;
rowUsed[i][num] = colUsed[j][num] = boxUsed[boxIdx][num] = false;
}
}
return false; // dacă niciun număr nu merge
}
}
}
return true; // complet rezolvat
}
void solveSudoku(vector<vector<char>>& board) {
MeraSudoku.resize(9, vector<int>(9, 0));
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] != '.') {
int num = board[i][j] - '0';
MeraSudoku[i][j] = num;
int boxIdx = getBoxIndex(i, j);
rowUsed[i][num] = true;
colUsed[j][num] = true;
boxUsed[boxIdx][num] = true;
}
}
}
solve();
for (int i = 0; i < 9; ++i)
for (int j = 0; j < 9; ++j)
board[i][j] = MeraSudoku[i][j] + '0';
}
};
// Funcție de afișare
void printBoard(const vector<vector<char>>& board) {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j)
cout << board[i][j] << ' ';
cout << '\n';
}
}
int main() {
vector<vector<char>> board = {
{'5','3','.','.','7','.','.','.','.'},
{'6','.','.','1','9','5','.','.','.'},
{'.','9','8','.','.','.','.','6','.'},
{'8','.','.','.','6','.','.','.','3'},
{'4','.','.','8','.','3','.','.','1'},
{'7','.','.','.','2','.','.','.','6'},
{'.','6','.','.','.','.','2','8','.'},
{'.','.','.','4','1','9','.','.','5'},
{'.','.','.','.','8','.','.','7','9'}
};
cout << "Initial Board:\n";
printBoard(board);
Solution solver;
solver.solveSudoku(board);
cout << "\nSolved Board:\n";
printBoard(board);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFNvbHV0aW9uIHsKcHVibGljOgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBNZXJhU3Vkb2t1OwogICAgYm9vbCByb3dVc2VkWzldWzEwXXt9OwogICAgYm9vbCBjb2xVc2VkWzldWzEwXXt9OwogICAgYm9vbCBib3hVc2VkWzldWzEwXXt9OwoKICAgIGludCBnZXRCb3hJbmRleChpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgcmV0dXJuIChyb3cgLyAzKSAqIDMgKyAoY29sIC8gMyk7CiAgICB9CgogICAgYm9vbCBzb2x2ZSgpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgewogICAgICAgICAgICAgICAgaWYgKE1lcmFTdWRva3VbaV1bal0gPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG51bSA9IDE7IG51bSA8PSA5OyArK251bSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm94SWR4ID0gZ2V0Qm94SW5kZXgoaSwgaik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm93VXNlZFtpXVtudW1dICYmICFjb2xVc2VkW2pdW251bV0gJiYgIWJveFVzZWRbYm94SWR4XVtudW1dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXJhU3Vkb2t1W2ldW2pdID0gbnVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VXNlZFtpXVtudW1dID0gY29sVXNlZFtqXVtudW1dID0gYm94VXNlZFtib3hJZHhdW251bV0gPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2x2ZSgpKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXJhU3Vkb2t1W2ldW2pdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1VzZWRbaV1bbnVtXSA9IGNvbFVzZWRbal1bbnVtXSA9IGJveFVzZWRbYm94SWR4XVtudW1dID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkYWPEgyBuaWNpdW4gbnVtxINyIG51IG1lcmdlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNvbXBsZXQgcmV6b2x2YXQKICAgIH0KCiAgICB2b2lkIHNvbHZlU3Vkb2t1KHZlY3Rvcjx2ZWN0b3I8Y2hhcj4+JiBib2FyZCkgewogICAgICAgIE1lcmFTdWRva3UucmVzaXplKDksIHZlY3RvcjxpbnQ+KDksIDApKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgewogICAgICAgICAgICAgICAgaWYgKGJvYXJkW2ldW2pdICE9ICcuJykgewogICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBib2FyZFtpXVtqXSAtICcwJzsKICAgICAgICAgICAgICAgICAgICBNZXJhU3Vkb2t1W2ldW2pdID0gbnVtOwogICAgICAgICAgICAgICAgICAgIGludCBib3hJZHggPSBnZXRCb3hJbmRleChpLCBqKTsKICAgICAgICAgICAgICAgICAgICByb3dVc2VkW2ldW251bV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbFVzZWRbal1bbnVtXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYm94VXNlZFtib3hJZHhdW251bV0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzb2x2ZSgpOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5OyArK2opCiAgICAgICAgICAgICAgICBib2FyZFtpXVtqXSA9IE1lcmFTdWRva3VbaV1bal0gKyAnMCc7CiAgICB9Cn07CgovLyBGdW5jyJtpZSBkZSBhZmnImWFyZQp2b2lkIHByaW50Qm9hcmQoY29uc3QgdmVjdG9yPHZlY3RvcjxjaGFyPj4mIGJvYXJkKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgOTsgKytqKQogICAgICAgICAgICBjb3V0IDw8IGJvYXJkW2ldW2pdIDw8ICcgJzsKICAgICAgICBjb3V0IDw8ICdcbic7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgdmVjdG9yPHZlY3RvcjxjaGFyPj4gYm9hcmQgPSB7CiAgICAgICAgeyc1JywnMycsJy4nLCcuJywnNycsJy4nLCcuJywnLicsJy4nfSwKICAgICAgICB7JzYnLCcuJywnLicsJzEnLCc5JywnNScsJy4nLCcuJywnLid9LAogICAgICAgIHsnLicsJzknLCc4JywnLicsJy4nLCcuJywnLicsJzYnLCcuJ30sCiAgICAgICAgeyc4JywnLicsJy4nLCcuJywnNicsJy4nLCcuJywnLicsJzMnfSwKICAgICAgICB7JzQnLCcuJywnLicsJzgnLCcuJywnMycsJy4nLCcuJywnMSd9LAogICAgICAgIHsnNycsJy4nLCcuJywnLicsJzInLCcuJywnLicsJy4nLCc2J30sCiAgICAgICAgeycuJywnNicsJy4nLCcuJywnLicsJy4nLCcyJywnOCcsJy4nfSwKICAgICAgICB7Jy4nLCcuJywnLicsJzQnLCcxJywnOScsJy4nLCcuJywnNSd9LAogICAgICAgIHsnLicsJy4nLCcuJywnLicsJzgnLCcuJywnLicsJzcnLCc5J30KICAgIH07CgogICAgY291dCA8PCAiSW5pdGlhbCBCb2FyZDpcbiI7CiAgICBwcmludEJvYXJkKGJvYXJkKTsKCiAgICBTb2x1dGlvbiBzb2x2ZXI7CiAgICBzb2x2ZXIuc29sdmVTdWRva3UoYm9hcmQpOwoKICAgIGNvdXQgPDwgIlxuU29sdmVkIEJvYXJkOlxuIjsKICAgIHByaW50Qm9hcmQoYm9hcmQpOwoKICAgIHJldHVybiAwOwp9Cg==