深度优先搜索(DFS)解数独问题
#include<bits/stdc++.h>
using namespace std;
int a[10][10];
bool h[10][10],l[10][10],g[10][10],flag;
int pre[9][9] = { //可以通过行列判断是在哪个9宫格
1,1,1,2,2,2,3,3,3,
1,1,1,2,2,2,3,3,3,
1,1,1,2,2,2,3,3,3,
4,4,4,5,5,5,6,6,6,
4,4,4,5,5,5,6,6,6,
4,4,4,5,5,5,6,6,6,
7,7,7,8,8,8,9,9,9,
7,7,7,8,8,8,9,9,9,
7,7,7,8,8,8,9,9,9
};
void dfs(int k){
if(flag) return ;
if(k>80){ //如果走到第81,则说明已经填完了数独,则输出当前答案即可
for(int i = 0 ; i < 9 ; i++){
for(int j = 0 ; j < 9 ; j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
flag = 1;
return ;
}
int x = k/9; // k表示第几个,则k/9则可知道当前格子在第几行
int y = k%9; //同理,k%9可知道当前格子在第几列
if(a[x][y]>0) // 如果a[x][y]>0 ,说明当前格子已经填过数字了 ,则直接进入下一个格子即可
dfs(k+1);
else{
for(int i = 1 ; i <= 9 ; i++){ //i表示想填入的数字
if(!h[x][i]&&!l[y][i]&&!g[pre[x][y]][i]){ // 如果x行,y列,切x行y列所在的9宫格都没有填入过i,则该i是可能填入的情况之一
h[x][i]=1; // 将x行的i标记为已填过
l[y][i]=1;//将y列的i标记为已填过
g[pre[x][y]][i]=1;//将该x行y列所在的9宫格的i标记为已填过
a[x][y]=i;//将i填入数独x行y列的格子
dfs(k+1);//进入下一个格子
h[x][i]=0;//如果走到这还没能输出,说明该 i 不可行 ,则将该 i 清除 , 接着循环i++即可继续试探下一种可能的i
l[y][i]=0;
g[pre[x][y]][i]=0;
a[x][y]=0;
}
}
}
}
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];
h[i][x]=1;
l[j][x]=1;
g[pre[i][j]][x]=1;
}
}
dfs(0);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】