代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int n;
int f[9][9];///记录每个位置的值  -1表示需要填
int check(int x,int y,int k) {
    for(int i = 0;i < 9;i ++) {
        if(i != x && f[i][y] == k)return 0;
        if(i != y && f[x][i] == k)return 0;
    }
    int xx,yy;
    for(int i = 0;i < 3;i ++) {
        xx = x / 3 * 3 + i;
        for(int j = 0;j < 3;j ++) {
            yy = y / 3 * 3 + j;
            if(!(xx == x && yy == y) && f[xx][yy] == k)return 0;
        }
    }
    return 1;
}
void dfs(int x,int y) {//x代表行,y代表列,分别从0-8共9行(列)
    if(x == 9) {///x范围已过已经把表格填了一遍了  输出结果并返回
        for(int i = 0;i < 9;i ++) {
            for(int j = 0;j < 9;j ++) {
                cout<<f[i][j]<<' ';
            }
            cout<<endl;
        }
        system("pause");
        return;
    }
    int xx = x,yy = y;
    f[x][y] = 1;///如果保持-1 下面循环不会进行 循环后会恢复为-1
    while(f[xx][yy] != -1) {
        if(xx >= 9)break;
        xx = xx + (yy + 1) / 9,yy = (yy + 1) % 9;///每循环一次yy+1,也就是从当前(x,y)的位置往右一行一行的遍历 找到下一个需要填的位置
    }
    f[x][y] = -1;
    for(int i = 1;i <= 9;i ++) {
        if(check(x,y,i)) {//当前填i可行的话 就dfs下一个需要填的位置(xx,yy)
            f[x][y] = i;
            dfs(xx,yy);
            f[x][y] = -1;//dfs终止表示这种策略不能dfs下去 位置值恢复为-1
        }
    }
}
int main() {
    memset(f,-1,sizeof(f));
    f[0][1] = 2;
    f[0][2] = 6;
    f[1][3] = 5;
    f[1][5] = 2;
    f[1][8] = 4;
    f[2][3] = 1;
    f[2][8] = 7;
    f[3][1] = 3;
    f[3][4] = 2;
    f[3][6] = 1;
    f[3][7] = 8;
    f[4][3] = 3;
    f[4][5] = 9;
    f[5][1] = 5;
    f[5][2] = 4;
    f[5][4] = 1;
    f[5][7] = 7;
    f[6][0] = 5;
    f[6][5] = 1;
    f[7][0] = 6;
    f[7][3] = 9;
    f[7][5] = 7;
    f[8][6] = 7;
    f[8][7] = 5;
    for(int i = 0;i < 9;i ++) {
        for(int j = 0;j < 9;j ++) {
            if(f[i][j] == -1)cout<<'*'<<' ';
            else cout<<f[i][j]<<' ';
        }
        cout<<endl;
    }
    getchar();
    dfs(0,0);
}