题解 | #Sudoku#
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
#include <iostream>
#include <vector>
using namespace std;
int find_answer_ok = 0;
vector< vector<int>> sudo(9, vector<int>(9, 0));
vector< vector<int>> zerr;
int num;
bool check(int step, int k) {
int m = zerr[step][0];
int n = zerr[step][1];
for (int i = 0; i < 9; i++) {
if (sudo[m][i] == k)
return false;
}
for (int i = 0; i < 9; i++) {
if (sudo[i][n] == k)
return false;
}
int m_start = m / 3 * 3;
int n_start = n / 3 * 3;
for (int i = m_start; i < m_start + 3; i++) {
for (int j = n_start; j < n_start + 3; j++) {
if (sudo[i][j] == k) { // 存放需要填的位置
return false;
}
}
}
return true;
}
void DFS(int step) {
if (step == num) {
find_answer_ok = 1;
return;
}
int m = zerr[step][0];
int n = zerr[step][1];
for (int k = 1; k <= 9; k++) {
if (check(step, k)) {
sudo[m][n] = k;
DFS(step + 1);
if(find_answer_ok) //找到直接return;
{
return;
}
sudo[m][n] = 0; //找不到继续回溯
}
}
return;
}
int main() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> sudo[i][j];
if (sudo[i][j] == 0) {
zerr.push_back({i, j});
}
}
}
num = zerr.size();
DFS(0);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout<<sudo[i][j]<<' ';
}
cout<<endl;
}
}
// 64 位输出请用 printf("%lld")
