# ZeroJudge - d263: 00989 - Su Doku
### 題目連結:https://zerojudge.tw/ShowProblem?problemid=d263
###### tags: `ZeroJudge` `深度優先搜尋(Depth First Search)` `窮舉`
```cpp=
#include <iostream>
#include <cstring>
using namespace std;
#define BLOCK(row, column, blockSize) ((row / blockSize) * blockSize + (column / blockSize))
bool isLegel, haveSolution;
int caseCount, rows[9], columns[9], blocks[9], board[9][9], boardSize, blockSize;
bool SolveSudoku(int nowRow, int nowColumn) {
do {
++nowColumn;
if (nowColumn == boardSize)
++nowRow, nowColumn = 0;
if (nowRow == boardSize) {
haveSolution = true;
return true;
}
} while (board[nowRow][nowColumn]);
for (int i = 1; i <= boardSize; ++i) {
if ((rows[nowRow] & (1 << i)) || (columns[nowColumn] & (1 << i)) || (blocks[BLOCK(nowRow, nowColumn, blockSize)] & (1 << i)))
continue;
board[nowRow][nowColumn] = i;
rows[nowRow] |= (1 << i);
columns[nowColumn] |= (1 << i);
blocks[BLOCK(nowRow, nowColumn, blockSize)] |= (1 << i);
if (SolveSudoku(nowRow, nowColumn))
return true;
board[nowRow][nowColumn] = 0;
rows[nowRow] ^= (1 << i);
columns[nowColumn] ^= (1 << i);
blocks[BLOCK(nowRow, nowColumn, blockSize)] ^= (1 << i);
}
return false;
}
int main() {
cin.sync_with_stdio(false); cin.tie(nullptr);
while (cin >> blockSize) {
if (caseCount)
cout << '\n';
++caseCount;
memset(rows, 0, sizeof(rows));
memset(blocks, 0, sizeof(blocks));
memset(columns, 0, sizeof(columns));
boardSize = blockSize * blockSize;
haveSolution = false;
isLegel = true;
for (int i = 0; i < boardSize; ++i)
for (int j = 0; j < boardSize; ++j)
if (cin >> board[i][j], board[i][j]) {
if ((rows[i] & (1 << board[i][j])) || (columns[j] & (1 << board[i][j])) || (blocks[BLOCK(i, j, blockSize)] & (1 << board[i][j])))
isLegel = false;
rows[i] |= (1 << board[i][j]);
columns[j] |= (1 << board[i][j]);
blocks[BLOCK(i, j, blockSize)] |= (1 << board[i][j]);
}
if (isLegel)
SolveSudoku(0, -1);
if (haveSolution)
for (int i = 0; i < boardSize; ++i) {
for (int j = 0; j < boardSize; ++j) {
if (j)
cout << ' ';
cout << board[i][j];
}
cout << "\n";
}
else
cout << "NO SOLUTION\n";
}
}
```