题意:
玩家需要根据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;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号