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