#include <iostream> using namespace std; /** * 回溯算法 * row[i][num]表示第i行是否出现过num * col[j][num]表示第j列是否出现过num * area[k][num]表示第k个3*3单元格是否出现过num k = 3*(row/3) + (col/3) * 回溯过程: * 当前格子没有数字--->遍历并根据限制条件选取可靠数字填入,更新限制条件,递归填写下一格 * 当前格子存在数字--->递归填写下一格 * 当前无法填入任何数字--->还原限制条件和已填入的数字,回到上一格再尝试下一个可用数字 * 知道所有格子都填上数字,遍历结束 */ int num[9][9], flag = 0; bool row[9][10] = {0}, col[9][10] = {0}, area[9][10] = {0}; void dfs(int index) { if (index == 81) { flag = 1; return; } int i = index / 9; int j = index % 9; if (num[i][j]) dfs(index + 1); else { for (int k = 1; k < 10; ++k) { int curRow = row[i][k]; int curCol = col[j][k]; int curArea = area[3 * (i / 3) + (j / 3)][k]; if (!row[i][k] && !col[j][k] && !area[3 * (i / 3) + (j / 3)][k]) { num[i][j] = k; row[i][k] = 1; col[j][k] = 1; area[3 * (i / 3) + (j / 3)][k] = 1; dfs(index + 1); if (flag) return; num[i][j] = 0; row[i][k] = curRow; col[j][k] = curCol; area[3 * (i / 3) + (j / 3)][k] = curArea; } } } } int main() { int x; for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { cin >> x; num[i][j] = x; // 初始化状态 if (x) { row[i][x] = 1; col[j][x] = 1; area[3 * (i / 3) + (j / 3)][x] = 1; } } } dfs(0); for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { cout << num[i][j] << " "; } cout << endl; } return 0; }