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

京公网安备 11010502036488号