1. 题目
![](https://img-blog.csdnimg.cn/20210403211327815.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTkzMjU3MA==,size_16,color_FFFFFF,t_70)
2. 代码
dfs深度优先搜索,从第一个开始摆放到最后一个。每摆放一个都判断一下该数字是否能放在此处。
#include <iostream>
using namespace std;
bool flag;
int num[9][9];
void output(){
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
cout << num[i][j] << " ";
}
cout << endl;
}
}
bool check(int n, int key){
for(int i=0; i<9; i++){
int j = n%9;
if(num[i][j]==key){
return false;
}
}
for(int j=0; j<9; j++){
int i = n/9;
if(num[i][j]==key){
return false;
}
}
int x0 = n / 9 / 3 * 3;
int y0 = n % 9 / 3 * 3;
for(int i=x0; i<x0+3; i++){
for(int j=y0; j<y0+3; j++){
if(num[i][j] == key){
return false;
}
}
}
return true;
}
void dfs(int n){
if(!flag){
if(n == 81){
output();
return;
}
if(num[n/9][n%9]!=0){
dfs(n+1);
}
else{
for(int i=1; i<=9; i++){
if(check(n, i)){
num[n/9][n%9] = i;
dfs(n+1);
num[n/9][n%9] = 0;
}
}
}
}
}
int main(){
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
cin >>num[i][j];
}
}
dfs(0);
}