dfs的入口可以是遍历的个数n也可以是坐标i,j,就是一些运算上的差别。是对每一种空间的遍历
#include<iostream> using namespace std; int empty[9][9] = { 0 };//记录该行该列有几个空格 int a[9][9];//输入数独 bool flag = false; bool check(int n, int value) { int row = n / 9; int column = n % 9; //行 for (int j = 0; j < 9; j++) { if (a[row][j] == value) { return false; } } //列 for (int j = 0; j < 9; j++) { if (a[j][column] == value) { return false; } } //九宫格 int rr = row / 3; int cc = column / 3; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (a[i + rr * 3][j + cc * 3] == value) { return false; } } } return true; } void dfs(int n) { if (n >= 81) { flag = true; return; } else { if (a[n / 9][n % 9] != 0) { n++; dfs(n); } else {//空格填数 for (int i = 1; i <= 9; i++) { if (check(n, i)) { a[n / 9][n % 9] = i; dfs(n + 1); if (flag) return; a[n / 9][n % 9] = 0; } } } } } int main() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cin >> a[i][j]; } } dfs(0); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cout << a[i][j]<<' '; } cout << endl; } return 0; }