本题是比较经典的回溯算法题目,数独问题。根据行号和列号作为搜索的条件,依次推断数独矩阵中需要计算的地方。本题其实也算是搜索类题目,需要注意的是,需要进行回溯。
#include<iostream>
#include <vector>
using namespace std;

bool check(vector<vector<int>> &nums, int row, int col, int val) {
    bool res = true;
    // 检查行方向
    for (int i = 0; i < 9; i++) {
        if (nums[row][i] == val) {
            res = false;
            return res;
        }
    }
    // 检查列方向
    for (int i = 0; i < 9; i++) {
        if (nums[i][col] == val) {
            res = false;
            return res;
        }
    }
    // 检查九宫格
    int row_limit = row / 3 * 3 + 3;
    int col_limit = col / 3 * 3 + 3;  // 九宫格列号终点上限
    for (int i = row_limit - 3; i < row_limit; i++) {
        for (int j = col_limit - 3; j < col_limit; j ++) {
            if (nums[i][j] == val) {
                res = false;
                return res;
            }
        }
    }
    return res;
}

void backtrack(vector<vector<int>> &nums, int row, int col, bool &find_ans) {
    // 已经遍历完这一行,换到下一行
    if (col == 9) {
        col = 0;
        row++;
    }
    // 遍历完全部矩阵,结束搜索
    if (row == 9 && col == 0) {
        find_ans = true;
        return;
    }
    
    if (nums[row][col] == 0) {
        for (int i = 1; i <= 9; i++) {
            if (check(nums, row, col, i)) {
                nums[row][col] = i;
                backtrack(nums, row, col + 1, find_ans);
                if (find_ans) return;   // 已经遍历完矩阵了,直接返回
                nums[row][col] = 0;
            } else {
                continue;
            }
        }
    } else {
        backtrack(nums, row, col + 1, find_ans);
    }
}

int main(){
    vector<vector<int>> nums(9, vector<int>(9, 0));
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            int m = 0;
            cin >> m;
            nums[i][j] = m;
        }
    }
    bool find_ans = false;
    backtrack(nums, 0, 0, find_ans);   // 从起点坐标开始搜索
    //输出
	for (vector<vector<int>>::iterator iter = nums.begin(); iter != nums.end(); iter++) {
		auto temp = *iter;
		for (vector<int>::iterator iterr = temp.begin(); iterr != temp.end(); iterr++) {
			cout << *iterr << " ";
		}
		cout << endl;
	}
}