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