题意:
        玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。


方法一:
递归dfs

思路:
        递归深搜。
       
       然后枚举每一个可取值,进行深搜。




#include <bits/stdc++.h>

using namespace std;
int row[9][10],col[9][10],grid[9][10];
int a[9][9];//存储数独
int flag=0;

void dfs(int x,int y){
    if(y==9){
        dfs(x+1,0);//递归下一行
        return;
    }
    if(x==9){//成功
        flag=1;
        for(int i=0;i<9;i++){//输出答案
            for(int j=0;j<9;j++){
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
        return;
    }
    if(a[x][y]==0){
        for(int i=1;i<=9;i++){//遍历1-9
            if(row[x][i]==0&&col[y][i]==0&&grid[x/3*3+y/3][i]==0){//同时都等于0,表示可取到i
                row[x][i]=col[y][i]=grid[x/3*3+y/3][i]=1;//设置为1
                a[x][y]=i;
                dfs(x,y+1);//递归下一列
                if(flag==1)//剪枝
                    return;
                a[x][y]=0;//恢复
                row[x][i]=col[y][i]=grid[x/3*3+y/3][i]=0;
            }
        }
    }else{
        dfs(x,y+1);
        if(flag==1)//剪枝
            return;
    }
}
int main(){
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            cin >> a[i][j];
            int x=a[i][j];
            row[i][x]=col[j][x]=grid[i/3*3+j/3][x]=1;//标记该值不能使用
        }
    }
    dfs(0,0);//深搜
    return 0;
}

时间复杂度:
空间复杂度:

方法二:
递归+空间优化

思路:
        对方法一中的空间进行优化。
        方法一运用二维数组来判断每一行、每一列、每一九宫格中1-9的值是否出现过。
        其实1-9的值可以优化为一个整数,运用位运算实现。

#include <bits/stdc++.h>

using namespace std;
int row[9],col[9],grid[9];//位运算
int a[9][9];//存储数独
int flag=0;

void dfs(int x,int y){
    if(y==9){
        dfs(x+1,0);//递归下一行
        return;
    }
    if(x==9){//成功
        flag=1;
        for(int i=0;i<9;i++){//输出答案
            for(int j=0;j<9;j++){
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
        return;
    }
    if(a[x][y]==0){
        for(int i=1;i<=9;i++){//遍历1-9
            if(((row[x]>>i)&1)==0&&((col[y]>>i)&1)==0&&((grid[x/3*3+y/3]>>i)&1)==0){//同时都等于0,表示可取到i
                row[x]|=1<<i;//设置为1
                col[y]|=1<<i;
                grid[x/3*3+y/3]|=1<<i;
                a[x][y]=i;
                dfs(x,y+1);//递归下一列
                if(flag==1)//剪枝
                    return;
                a[x][y]=0;//恢复
                row[x]-=1<<i;
                col[y]-=1<<i;
                grid[x/3*3+y/3]-=1<<i;
            }
        }
    }else{
        dfs(x,y+1);
        if(flag==1)//剪枝
            return;
    }
}
int main(){
    for(int i=0;i<9;i++){//输入
        for(int j=0;j<9;j++){
            cin >> a[i][j];
            int x=a[i][j];
            row[i]|=1<<x;//位运算
            col[j]|=1<<x;
            grid[i/3*3+j/3]|=1<<x;
        }
    }
    dfs(0,0);//深搜
    return 0;
}

时间复杂度:
空间复杂度: